经典的线程协作例子

 

两个过程:一个是将蜡图到车上,一个是抛光它。抛光任务在图蜡任务完成之前,是不能执行工作的,而图蜡任务在涂另一层蜡之前,必须等抛光任务完成。
这里使用wait()和notifyAll()挂起和重新启动这些任务。

 

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
//打蜡工人
class Paintor implements Runnable{
 String name;
 Car c1;
 Paintor(String n,Car c){
  c1 = c;
  name = n;
 }
 @Override
 public void run() {
  try {
   c1.paint(name);
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
 }
}


//抛光工人
class Bufffer implements Runnable{
 String name;
 Car c1;
 Bufffer(String n,Car c){
  c1 = c;
  name = n;
 }
 @Override
 public void run() {
  try {
   c1.buff(name);
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
 }
}

 

public class Car {
 private boolean isPainted = false;
 //打蜡
 public synchronized void paint(String worker) throws InterruptedException{
  while(isPainted){
   System.out.println(worker +" is waiting to paint");
   wait();//还没抛光,去休息,把工作位置让出
  }
  System.out.println(worker +" is painting");
  isPainted = true;
  notifyAll();
 }
 //抛光
 public synchronized void buff(String worker) throws InterruptedException{
  while(!isPainted){
   System.out.println(worker +" is waiting to buff");
   wait();//还没打蜡,去休息,把工作位置让出
  }
  System.out.println(worker +" is buffing");
  isPainted = false;
  notifyAll();//所有正在休息的工人出来排队准备干活
 }

 public static void main(String[] args) {
  final Car car1 = new Car();
  ExecutorService es = Executors.newCachedThreadPool();
  for(int i=1;i<=10;i++){//创建10个打蜡工人,10个抛光工人
   es.submit(new Paintor("Painter"+i,car1));
   es.submit(new Bufffer("Bufffer"+i,car1));
  }
  es.shutdown();
 }

}

==================================

某次运行结果:

Painter1 is painting
Painter2 is waiting to paint
Bufffer1 is buffing
Painter2 is painting
Painter3 is waiting to paint
Painter4 is waiting to paint
Painter5 is waiting to paint
Bufffer5 is buffing
Painter5 is painting
Painter4 is waiting to paint
Painter3 is waiting to paint
Bufffer2 is buffing
Painter3 is painting
Painter4 is waiting to paint
Bufffer9 is buffing
Painter7 is painting
Painter4 is waiting to paint
Painter10 is waiting to paint
Painter6 is waiting to paint
Bufffer6 is buffing
Painter6 is painting
Painter10 is waiting to paint
Painter4 is waiting to paint
Painter8 is waiting to paint
Painter9 is waiting to paint
Bufffer3 is buffing
Painter9 is painting
Painter8 is waiting to paint
Painter4 is waiting to paint
Bufffer4 is buffing
Bufffer7 is waiting to buff
Bufffer8 is waiting to buff
Bufffer10 is waiting to buff
Painter10 is painting
Bufffer10 is buffing
Bufffer8 is waiting to buff
Bufffer7 is waiting to buff
Painter4 is painting
Painter8 is waiting to paint
Bufffer7 is buffing
Bufffer8 is waiting to buff
Painter8 is painting
Bufffer8 is buffing

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值