线程间的通信
这里讲的是同步,是指多个线程通过synchronized关键字这种方式来实现线程间的通信。
案例:
生产者生成水果,如果水果没有被买走那么就不生产,处于等待状态,如果水果被消费者买走这时候消费者就会通知生产者,告诉他我们已经把水果买走了请重新生产。
消费者同理,如果水果已经生产出来那么就买走,买走了之后通知生产者水果已经没有了,请生产。
注意:
1.线程间的通讯共享数据一定要有同步代码块 synchronized
2.一定要有wait和notify,而且二者一定是成对出现。
3.生产者和消费者的线程实现一定是在white(true)里面
第一种方式 继承 Thread
创建篮子:
package demo3;
//创建篮子
public class Basket {
private boolean isEmpty; //是否为空
public boolean isEmpty(){
return isEmpty;
}
public void setEmpty(boolean empty){
isEmpty = empty;
}
}
创建生产者:
package demo3;
//创建生产者
public class Producer extends Thread {
private Basket basket;
public Producer(Basket basket){
super();
this.basket = basket;
}
@Override
public void run(){
while (true){
//定义一个同步代码块
synchronized (basket){
try {
if (!basket.isEmpty()){//不为空就执行线程等待
//线程等待的状态
basket.wait();
}
System.out.println("生产水果");
//设置篮子现在不为空
basket.setEmpty(false);
//通知在这个共享对象上等待的线程
basket.notify();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
创建消费者:
package demo3;
//创建消费者
public class Consumer extends Thread {
private Basket basket;
public Consumer(Basket basket){
super();
this.basket = basket;
}
@Override
public void run(){
while (true){
//定义一个同步代码块
synchronized (basket){
try {
if (basket.isEmpty()){ //为空就执行线程等待
//线程等待的状态
basket.wait();
}
System.out.println("消费水果");
//设置篮子现在为空
basket.setEmpty(true);
//通知在这个共享对象上等待的线程
basket.notify();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
创建测试类:
package demo3;
//测试类
public class Test {
public static void main(String[] args) {
Basket basket = new Basket();
Producer producer = new Producer(basket);
Consumer consumer = new Consumer(basket);
//给一个休眠时间,以免太快
producer.start();
consumer.start();
}
}
第二种方式 接口 Runnable
篮子写法不变:
package demo3;
public class Basket {
private boolean isEmpty; //是否为空
public boolean isEmpty(){
return isEmpty;
}
public void setEmpty(boolean empty){
isEmpty = empty;
}
}
创建生产者:
package demo3;
public class Producer implements Runnable{
private Basket basket;
public Producer(Basket basket){
super();
this.basket = basket;
}
@Override
public void run(){
while (true){
//定义一个同步代码块
synchronized (basket){
try {
if (!basket.isEmpty()){//不为空就执行线程等待
//线程等待的状态
basket.wait();
}
System.out.println("生产水果");
//设置篮子现在不为空
basket.setEmpty(false);
//通知在这个共享对象上等待的线程
basket.notify();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
创建消费者:
package demo3;
public class Consumer implements Runnable {
private Basket basket;
public Consumer(Basket basket){
super();
this.basket = basket;
}
@Override
public void run(){
while (true){
//定义一个同步代码块
synchronized (basket){
try {
if (basket.isEmpty()){ //为空就执行线程等待
//线程等待的状态
basket.wait();
}
System.out.println("消费水果");
//设置篮子现在为空
basket.setEmpty(true);
//通知在这个共享对象上等待的线程
basket.notify();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
创建测试类:
package demo3;
public class Test {
public static void main(String[] args) {
Basket basket = new Basket();
Producer producer = new Producer(basket);
Consumer consumer = new Consumer(basket);
Thread t = new Thread(producer);
Thread t1 = new Thread(consumer);
//给一个休眠时间,以免太快
t.start();
t1.start();
}
}