第二章、Java并行程序基础
因为这章的内容在我的另一篇博客中戳我一下已经讲解过了,所以这里就不叙述重复的内容,我只把一些我以前理解中不足的地方总结一下。
1、不要使用Thread.stop()
方法来终止线程,该方法会直接终止线程,并立即释放这个线程所持有的锁,如果写线程写入数据写到一半被强行终止,那么数据信息就会被破坏。
2、线程中断:
线程中断并不会使线程立即退出,而是给线程发送一个通知,告知目标线程有人需要你退出了,至于目标线程接到通知后如何处理,则有目标线程自行决定。与线程中断有关的三个方法:
-
public void Thread.interrupt()
:通知目标线程中断,也就是设置中断标志位,中断标志位表示当前线程已经被中断了。 -
public boolean Thread.isInterruped()
:判断当前线程是否被中断(通过检查中断标志位) -
public static boolean Thread.interrupted()
:判断当前线程是否被中断,但同时清楚中断标志位。
注意有些方法会抛出InterruptedException
中断异常,也就是说如果我们的程序在运行时被中断,那么程序就执行处理异常的代码,同时清除中断标记。
3、等待和通知:
“等待和通知是发生在同一个对象实例上的”,刚开始我不是很理解这句话,后来我假设对象实例就是一张大床,而线程就是一个个人,我们让A
线程在OvjectA
对象实例上睡觉(等待),那么我们就必须去ObjectA
这张床上叫醒线程A
,我们不可能从ObjectB
对象实例伤叫醒线程A
,这样我感觉好理解多了。 object.notify()
方法是随机从等待的线程中唤醒一个,而不是唤醒最早等待的线程。
这里最重要的一点就是wait
和notify
方法并不是可以随便使用的,这两个方法都必须在获得锁之后才能使用
这里也说明一下Object.wait()
和Thread.sleep()
方法的差别,wait
方法可以被唤醒,并且wait
方法会释放锁。
4、我们可以看到Thread
类中有suspend
(挂起)和resume
(继续执行)这两个方法,注意这两个方法和Thead.stop()
方法一样已经被废弃,推荐不要使用,这里稍微讲解一下这两个方法的弊端: suspend()
方法在挂起线程的同时并不释放资源,只有在对应的线程上使用了resume
方法后该线程才能继续执行。但是如果在对应线程的suspend
方法前使用了resume
方法,那么这个线程就会永久挂起。
5、volatile
关键字:
我感觉这本书并没有讲清楚volatile
关键字的用法,我在网上看到了一片讲解的非常清楚的文章,分享一下:戳我一下
6、线程组:
我们可以通过ThreadGroup tg = new ThreadGroup("线程组名")
来创建一个线程组,我们可以通过调用线程组的实例方法来获得活动线程的总数,也可以打印这个线程组中所有线程的信息。