多线程知识3-线程间通信

常用的线程间通信实现:

(1)等待/通知机制:wait/Notify实现进程间通信

(2):生产者消费者实现

(3):管道

(4).join()方法,

(5ThreadLocal类的使用。

 

(1):等待通知机制的实现:wait方法是使当前执行代码的线程进行等待。

是object的方法,该方法将线程放入预处理队列中,并且在该处停止执行。

会释放锁。在调用wait之前,必须要有对象锁,也就是说必须在同步方法或者同步块中使用。如果没有适当的锁,会抛出:IllegalMonitorStateException异常。而notify也要在同步块中调用,用来通知那些等待该对象锁的其他线程,如果有多个线程,由jvm选择一个即可,用notifyAll则是通知所有等待的线程:注意的是:通知之后不会立即释放锁,而是退出Synchronized块的时候,才会释放。

每个锁对象都有两个队列,就绪队列和阻塞队列。

Wait被执行后锁自动释放,notify执行后,锁不释放

当线程处于wait状态时,执行interrupt会出现InterruptException异常。

执行完同步代码块就会自动释放锁

在同步代码块执行过程中要是出现异常,会释放锁

 

(2):生产者消费者模式:一对一模式,多对多模式可能出现假死的现象,出现假死的原因是连续唤醒的是同类。解决方法是用notifyAll.

(3)通过管道通信:一。字节流,管道流是一种特殊的流,用于在不同的线程间进行通信,通信的介质是内存。一个线程发送数据到输出管道PipedOutputStream,另一个线程从输入管道读出数据。在jdk中提供了四个类来使线程可以通信:PipedInputStream,PipedOutputStream,PipedReader,PipedWriter 

使用inputStream.connect(outputstream),或者OutputStream.connect(inputstream)可以使两个Stream之间产生通信连接,这样才可以进行数据的输入和输出。

(4)Join:在很多情况下,主线程创建了子线程,但是子线程有大量的耗时计算,主线程往往结束的早,着时候要是主线程要等子线程结束再结束就要用join,join的作用是等待线程对象销毁。

Join也有使线程进行排队等待的作用,类似于同步的效果

但是Join与Synchronized的区别是:join在内部使用的是wait方法进行等待,而Synchronized使用的是对象监视器的原理作为同步。

Join(long)方法具有释放锁的特点,因为在内部是wait(long)实现的.Thread.sleep(long)却不释放锁。

(5):每一个线程都有自己共享的实例变量,ThreadLocal类就是解决这样的问题。将ThreadLocal类比作一个盒子,每个盒子中可以存储每个线程的私有数据。ThreadLocal解决的是不同线程之间的隔离性,也就是说每个线程拥有自己的值,不同线程中的值是可以放到该类中进行保存。

你可能感兴趣的:(javaweb)