? 1.只要使用new关键字创建一个线程对象,并且将它start()起来即可
? ①核心部分是start0这个本地方法(JNI方法)??
?
? ②在开始执行这个线程时,JVM将会调用该线程的run方法,换言之,run方法是被JNI方法start0()调用的,可得出几个知识点
? --Thread被构造后的NEW状态,事实上threadStatus这个内部属性为0
? --不能两次启动Thread,否则就会出现IllegalThreadStateException异常
? --线程启动后将会被加入到一个ThreadGroup中
? --一个线程生命周期结束,也就是到了TERMINATED状态,再次调用start方法是不允许的,也就是说TERMINATED状态是没有办法回到RUNNABLE/RUNNING状态的
3.Thread run()源码??
①线程的真正执行逻辑在run方法中,通常我们把run方法称为线程的执行单元,重写run()方法,用start()方法启动
? ②准确地讲,创建线程只有一种方式那就是构造Thread类,而实现线程的执行单元(run())则有两种方式,第一种是重写Thread的run方法,第二种是实现Runnable接口的run方法,并且将Runnable实例用作构造Thread的参数
? 错误说法(不严谨):①构造一个Thread ②实现Runnable接口
? ③无论是Runnable的run方法,还是Thread类本身的run方法(事实上Thread类也实现了Runnable接口),都是想将线程的控制本身和业务逻辑的运行分离开来,达到职责分明、功能单一的原则
? ④另外重写Thread的run方法与实现Runnable接口的run方法不同:那就是Thread类的run方法是不能共享的,线程A不能把B线程的run方法当作自己的执行单元,而Runnable接口则很容实现这一点,使用同一个Runnable的实例构造不同的Thread实例
? 1.被标注为废弃的stop()方法,过于暴力,强行把执行到一半的线程终止,可能会引起一些数据不一致的问题
? 2.终止线程,立刻释放了锁,破坏了对象一致性,强行终止,对象被写坏,另一个等待的线程直接读到不一致的对象
? ①interrupt() 是一个实例方法,它通知目标线程中断,也就是设置,中断标志位表示当前线程已经被中断了
? ②可被打断阻塞的方法
?
? ③阻塞被打断,会抛出InterruptedException异常,这个异常就像一个signal(信号)一样通知当前线程被打断了
? ininterrupted()也是实例方法,它判断当前线程是否有被中断(通过检查中断标志位)
? ①isInterrupted()方法和interrupted方法都调用了同一个本地方法
? ②ClearInterrupted主要用来控制是否擦除线程interrupt的中断标志位
? isInterrupted()方法中该参数为false,表示不想擦除
-------------摘自《Java高并发编程详解》、《实战Java高并发程序设计》
原文:https://www.cnblogs.com/Seraphire-yili/p/13923107.html