线程之间如何通信?
1、设置一个标志变量,写一个死循环轮训该标志变量。(由于这种方式不推荐,这里不详细说明)
2、使用 等待/通知机制(wait/notify)来实现。(重点)
这种方式实现需要使用到wait()、notify()、notifyAll()方法,它们都属于Object里的方法。
wait()方法的作用:让当前执行代码的线程进入等待状态。该方法被调用后,当前线程会释放该对象所拥有的锁,停止剩余操作,当接到notify通知时,才继续执行后面的操作,否则一直处于等待状态。
notify()/notifyAll()方法的作用:通知那些等待获取该对象锁的线程,它们可以获取该对象锁了。该方法被调用后,并不会立刻就释放所拥有的锁,而是执行完剩余操作之后,才会释放锁。
以上几个方法在调用之前,必须获取该对象的对象级别锁,否则会报异常。即:只能在同步代码块或者同步方法里使用。
小例子:要求共有两个线程,第一个线程输出“开始出发了...”和“已经到了火星...”这两句,第二个线程输出中间的语句,通过等待/通知机制实现如下效果?
参考代码如下:
package com.cjh;
/**
* @author 陈嘉豪
*/
public class MyThread1 extends Thread{
private String lock;
public MyThread1(String lock){
this.lock = lock;
}
@Override
public void run() {
synchronized(lock){
System.out.println("开始出发了...");
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("已经到了火星...");
}
}
}
package com.cjh;
/**
* @author 陈嘉豪
*/
public class MyThread2 extends Thread{
private String lock;
public MyThread2(String lock){
this.lock = lock;
}
@Override
public void run() {
synchronized(lock){
for(int i=1;i<=6;i++){
System.out.println("走了"+i+"步");
lock.notify();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
package com.cjh.test;
import com.cjh.MyThread1;
import com.cjh.MyThread2;
public class ThreadTest {
public static void main(String[] args) throws InterruptedException {
String lock = "lockObject";
MyThread1 myThread1 = new MyThread1(lock);
myThread1.start();
MyThread2 myThread2 = new MyThread2(lock);
myThread2.start();
}
}
运行测试类,即可得到效果。到此你有没有对线程通信思想有个大概的了解了呢?O(∩_∩)O~