厌伴老儒烹瓠叶,强随举子踏槐花。这篇文章主要讲述Java 线程系列Java 天生就是多线程相关的知识,希望能为你提供帮助。
作者:??半身风雪??@??TOC??
上一篇:??线程之间的共享和协作??
前言
一、java 中的线程
文章图片
一个Java 程序从main() 方法开始执行,然后按照既定的代码逻辑执行,看似没有其他线程参与,但实际上Java
程序天生就是多线程程序,因为执行main() 方法的是一个名称为main 的线程。
public static void main(String[] args)
//java 虚拟机线程系统的管理接口
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
//不需要获取同步的monitor 和synchronizer 信息,仅仅获取线程和线程堆栈信息
ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false);
//遍历线程,仅打印线程ID 和线程名称信息
for (ThreadInfo threadInfo : threadInfos)
System.out.println("线程ID" + threadInfo.getThreadId() + "线程名" + threadInfo.getThreadName());
上面代码输出的结果:
文章图片
- $\\textcolorredMonitor Ctrl-Break$监控 Ctrl-Break 中断信号的
- $\\textcolorredSignal Dispatcher$分发处理发送给 JVM 信号的线程
- $\\textcolorred Finalizer$调用对象 finalize 方法的线程
- $\\textcolorredReference Handler$清除 Reference 的线程
- $\\textcolorred main $main 线程,用户程序入口
从上面的例子中,我们能发现,在Java中短短的几行代码,就给我们启动了5个线程,当然,不同的版本,启动的线程数量也不一样,由此我们可以得出:**Java1、启动
天生就是多线程的**
线程的启动方式有两种(源码中的注释是这么写的)参见代码:cn.enjoyedu.ch1.base.NewThread:
- X extends Thread; ,然后 X.start
- X implements Runnable;然后交给 Thread 运行
示例代码:(派生自Thread 类,来实现我们的两种线程启动方式)
/**
* 扩展自Thread 类
*/
private static class UserThread extends Thread
@Override
public void run()
System.out.println("UserThread.run");
/**
* 扩展自 Runnable 类
*/
private static class UserRunnable implements Runnable
@Override
public void run()
System.out.println("UserRunnable.run");
public static void main(String[] args)
UserThread userThread = new UserThread();
userThread.start();
UserRunnable userRunnable = new UserRunnable();
new Thread(userRunnable).start();
【Java 线程系列Java 天生就是多线程】Thread 和 Runnable 的区别:
- ?
?Thread?
? 是Java 里对线程的唯一抽象。 - ?
?Runnable?
? 是Java对任务(业务逻辑)的抽象。 - ?
?Thread?
? 可以接受任意一个??Runnable?
? 的实例并执行。
- ?
?线程自然终止:?
?要么是run 执行完成了,要么是抛出了一个未处理的异常导致线程提前结束。 - ?
?stop:?
?暂停、恢复和停止操作对应在线程Thread的API就是??suspend()、resume() 和 stop()?
?。但是这些API都是过期的,不再建议使用。不建议使用的主要原因有:以??suspend()?
?方法为例,在调用后,线程不会释放已占有的资源(比如锁),而是占有资源进入睡眠状态,这样容易引发死锁问题。同样,??stop()?
? 方法在终结一个线程时,不会保证线程的资源正常释放,通常是没有给予线程完成资源释放的机会,因此会到导致程序可能工作在不确定的状态下。整因为??suspend()、resume() 和 stop()?
? 方法带来的副作用,这些方法才会被标注为不建议使用的过期方法中。 - ?
?中断:?
?安全的中止则是其它线程通过调用线程A的??interrupt()?
? 方法对其进行中止操作,中断代表着其它线程对A线程打了个招呼,“A, 你要中断了”,不代表线程A 会立即停止自己的工作,同样A线程可以不理会这种请求。因为Java 中的线程是协作式的,不是抢占式。线程通过检查自身的中断标志位是否被置为true来进行响应。
private static class UserThread extends Thread
public UserThread(String name)
super(name);
@Override
public void run()
String threadName = Thread.currentThread().getName();
System.out.println(threadName + "interrupt flag = " + isInterrupted());
while (!isInterrupted())
//while (!Thread.interrupted())
//while (true)
System.out.println(threadName+ "is running");
System.out.println(threadName+ "inner interrupt flag = "+ isInterrupted());
System.out.println(threadName+ "interrupt flag = " + isInterrupted());
public static void main(String[] args)
推荐阅读
- nginx配置 解决 vue history模式下空白 ,以及SSL证书安装
- Java后端常见面试题总结
- JAVA经典面试题附答案(持续更新版)
- 小程序输入框完成自动切换到下个输入框
- vue - ES6模块化promisewebpack打包(所在在学的朋友们先看这篇,看了不吃亏)...
- 面试官(说一下MySQL事务隔离级别())
- 2022 年我们最喜欢的 Chrome 扩展程序
- 多线程 如何自己实现定时器
- 自然语言处理(NLP)(24基于文本语义的智能问答系统)