课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
线程问题相信大家在学习java编程开发的时候应该都有过接触了,尤其是在执行多任务的情况下,我们需要使用锁来保持任务行为,下面我们就一起来了解一下多线程环境下的线程通信问题都有哪些。
1. 中断和检查中断机制
利用中断和加入线程(join)属于Thread提供的原生机制,用来实现线程之间的通信。
关于中断,Java中的线程是通过中断状态来标识,可以通过线程的实例方法interrupt()来设置(该方法内部会调用一个native方法interrupt0()进行设置)。中断状态只是一个状态,并不会直接影响线程的运行,Java中是通过一些间接的方式来达到控制线程的效果,比如:
检查在循环中断状态,判断是否需要退出线程;
或者通过对中断状态进行监控,用一旦发现改变就抛出异常这种方式来通知程序;
2. 加入线程(Join)
join()方法也是Thread提供的一个实例方法,提供了一个类似线程之间等待的效果。一个线程可以调用另一个线程的join()方法,调用之后,该线程将进入等待状态,直到另一个线程执行完毕,该线程才会继续执行。
3. 互斥+信号(synchronized、ReentrantLock)
Java中线程之间的互斥主要是借助于synchronized、ReentrantLock来实现,互斥既可以保证任务之间的串行,也可以保证某一时刻只有一个任务可以响应某个信号。在互斥之上,我们为任务添加了一种途径,可以将其自身挂起,直至某些外部条件发生变化,表示是时候让这个任务向前继续执行。这种握手可以通过Object的方法wait()和notify()来安全地实现,也可以通过Java SE5中并发类库提供的具有await()和signal()方法的Condition对象。
通过synchronized实现的互斥和Object提供的wait()、notify()/notifyAll()方法互相配合,可以实现线程之间的等待通知机制。调用wait()、notify()等方法的对象必须为对象锁,且必须在同步块内执行调用。调用wait()方法的线程将进入等待状态,且会释放已经获取的同步锁;调用notify()/notifyAll()方法的线程将会通知处于等待状态的线程,从等待状态切换到准备竞争同步锁,一旦抢到锁则继续从之前等待的地方(即wait()处)执行
4. 利用并发工具包中的构件(CountLatchDown、CyclicBarrier)
java.util.concurrent包在JDK1.5之后引入了大量用来解决并发问题的新类,比如CountDownLatch、CyclicBarrier等,各有自己的特点。
5. 共享内存变量(volatile)
volatile关键字可以保证可见性和有序性,这里也是利用其可见性来实现线程之间的通信的,因为被volatile修饰的变量一旦发生变化,对其它线程是可见的。通过监控某个共享变量,当其状态发生改变时,就可以认为是收到别的线程的信号了。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。