线程通信的常用方法:
● wait()方法:令当前线程挂起并放弃CPU同步资源,使别的线程可访问并修改共享资源,而当前线程排队等候再次对资源的访问。
● notify()方法:唤醒正在排队等待同步资源的线程中优先级最高者结束等待。
● notifyAll()方法:唤醒正在排队等待资源的所有线程结束等待。使用两个线程打印 1-100. 线程1, 线程2 交替打印
Java.lang.Object 提供的这三个方法只有在synchronized()方法或者syschronized代码块中才能使用,否者会报异常。
示例代码:使用两个线程打印 1-100. 线程1, 线程2 交替打印
//线程通信。如下的三个关键字使用的话,都得在同步代码块或同步方法中。
//wait():一旦一个线程执行到wait(),就释放当前的锁。
//notify()/notifyAll():唤醒wait的一个或所有的线程
//使用两个线程打印 1-100. 线程1, 线程2 交替打印
class PrintNum implements Runnable {
int num = 1;
Object obj = new Object();
public void run() {
while (true) {
synchronized (obj) {
obj.notify();
if (num <= 100) {
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":"
+ num);
num++;
} else {
break;
}
try {
obj.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
public class TestCommunication {
public static void main(String[] args) {
PrintNum p = new PrintNum();
Thread t1 = new Thread(p);
Thread t2 = new Thread(p);
t1.setName("甲");
t2.setName("乙");
t1.start();
t2.start();
}
}