-
Thread.stop
方法会立即终止线程,可能会导致数据不一致的情况,正确的结束线程的方法是在run
方法中加上对终止标识的判断逻辑实现 - 线程中断不会使线程立即退出,而是给线程发送一个通知,告知目标线程有人希望你退出,接到通知后的处理由目标线程自行决定,有以下三个方法
public void Thread.interrupt() // 中断线程,设置中断标志 public boolean Thread.isInterrupted() // 判断是否被中断 public static boolean Thread.interrupted() // 判断是否被中断,并清除当前中断状态
- 直接中断线程并不会让线程停止,必须自行加入中断检测逻辑,一些会抛出
InterruptedException
的方法,捕获异常后中断标识会清楚,如有需要必须自行中断重新设置中断标识Thread.currentThread().interrupt()
- 线程的协作可通过
Object
类提供的wait、notify、notifyAll
这三个方法在synchronized
代码块中实现(必须先获得目标对象的一个监视器,执行方法后释放),执行obj.wait()
的线程A将会等待,直到在其他线程B中之行了obj.notify()
后线程A才会被唤醒。如果一个线程调用了obj.wait()
,那么它就会进入obj
对象的等待队列,这个队列中可能有多个线程都在同时等待obj
对象;当obj.notify()
被调用时,就从等待队列中随机选择一个线程(非公平),并将其唤醒。Object
类中的notifyAll
方法会唤醒队列中所有等待的线程。 - 在主线程中调用
t.join()
会阻塞主线程直到线程t
执行完毕,静态方法Thread.yield()
使当前线程让出CPU,重新进行资源争夺,有可能会继续执行 -
volatile
修饰的变量用于标识变量在多线程环境中的易变性,JVM会将让线程发现该变量的实际值,但是他并不会影响变量操作的原子性,例如i++
是非原子操作 - 可以将功能相同的线程放在同一个线程组中
- 守护线程主要是做一些系统性的服务,被守护的线程结束后,其守护线程也会立即终止,另外守护线程必须在
start()
之前设置才回生效 - 线程的优先级和操作系统有关,并非绝对的可预测调度情况
-
synchronized
有多种用法- 指定加锁对象:对给定对象加锁,进入同步代码前要获得给定对象的锁
- 直接作用于实例方法:相当于对当前实例加锁,进入同步代码前要活的当前实例的锁
- 直接作用于静态方法:相当于对当前类加锁,进入同步代码前要获得当前类的锁
第2章 Java并行程序基础
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要...