线程间的相互作用:线程之间需要一些协调通信,来共同完成一件任务
Object中的
notify():唤醒在此对象监视器上等待的单个线程。
notifyAll():唤醒在此对象监视器上等待的所有线程。;
wait();在其他线程调用此对象的 方法notifyAll()或 notify() 方法前,导致当前线程等待。
下面用代码实现一个线程间通信实例:
产品信息:
public class Products {
// 产品的属性
private String name;
private int length;
// 标记位作为判断是否有物品;
boolean flag;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getLength() {
return length;
}
public void setLength(int length) {
this.length = length;
}
}
生产者:
public class Producer implements Runnable {
private Products pr;
private int x = 0;
Producer(Products pr) {
this.pr = pr;
}
public void run() {
while (true) {
synchronized (pr) {
//如果产品是否还有
if (pr.flag) {
try {
//如果还有则等待
pr.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (x % 2 == 0) {
pr.setName("黑马程序员");
pr.setLength(1);
} else {
pr.setName("党学义");
pr.setLength(2);
}
x++;
//生产完将标记为标记为true 。告诉生产者产品有
pr.flag = true;
//唤醒正在等待对的消费品
pr.notify();
}
}
}
}
消费者:
public class Consumer implements Runnable {
private Products pr;
Consumer(Products pr) {
this.pr = pr;
}
public void run() {
while (true) {
synchronized (pr) {
if (!pr.flag) {
try {
//判断如果没有产品,则等待
pr.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(pr.getName() + "-----" + pr.getLength());
pr.flag = false;
//将产品消费后就唤醒等待生产的生产者线程
pr.notify();
}
}
}
}
开启线程:
public class ThreadDemo {
/**
* @param args
*/
public static void main(String[] args) {
// 生产一个物品
Products pr = new Products();
// 生产者线程
Producer per = new Producer(pr);
// 消费者线程
Consumer cer = new Consumer(pr);
Thread tr1 = new Thread(per);
Thread tr2 = new Thread(cer);
// 启动生产者线程
tr1.start();
// 开启消费者线程
tr2.start();
//打印的结果,出现很和谐的情况。没有出现结果错过的情况;
}
}