多条线程之间有时需要数据交互,下面介绍五种线程间数据交互的方式,他们的使用场景各有不同。
1. volatile、synchronized关键字
PS:关于volatile的详细介绍请移步至:Java并发编程的艺术(三)——volatile
1.1 如何实现通信?
这两种方式都采用了同步机制实现多条线程间的数据通信。与其说是“通信”,倒不如说是“共享变量”来的恰当。当一个共享变量被volatile修饰 或 被同步块包裹后,他们的读写操作都会直接操作共享内存,从而各个线程都能看到共享变量最新的值,也就是实现了内存的可见性。
1.2 特点
- 这种方式本质上是“共享数据”,而非“传递数据”;只是从结果来看,数据好像是从写线程传递到了读线程;
- 这种通信方式无法指定特定的接收线程。当数据被修改后究竟哪条线程最先访问到,这由操作系统随机决定。
- 总的来说,这种方式并不是真正意义上的“通信”,而是“共享”。
1.3 使用场景
这种方式能“传递”变量。当需要传递一些公用的变量时就可以使用这种方式。如:传递boolean flag,用于表示状态、传递一个存储所有任务的队列等。
1.4 例子
用这种方式实现线程的开关控制。
// 用于控制线程当前的执行状态
private volatile boolean running = false;
// 开启一条线程
Thread thread = new Thread(new Runnable(){
void run(){
// 开关
while(!running){
Thread.sleep(1000);
}
// 执行线程任务
doSometing();
}
}).start();
// 开始执行
public void start(){
running = true;