【多线程2】
主要内容
1. 线程通信
2. 线程池
3. ForkJoin
学习目标
第一节 线程通信
1.1 线程通信引入
l 应用场景:生产者和消费者问题
• 假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中产品取走消费
• 如果仓库中没有产品,则生产者将产品放入仓库,否则停止生产并等待,直到仓库中的产品被消费者取走为止
• 如果仓库中放有产品,则消费者可以将产品取走消费,否则停止消费并等待,直到仓库中再次放入产品为止
• 分析
• 这是一个线程同步问题,生产者和消费者共享同一个资源,并且生产者和消费者之间相互依赖,互为条件
• 对于生产者,没有生产产品之前,要通知消费者等待。而生产了产品之后,又需要马上通知消费者消费
• 对于消费者,在消费之后,要通知生产者已经消费结束,需要继续生产新产品以供消费
• 在生产者消费者问题中,仅有synchronized是不够的
• synchronized可阻止并发更新同一个共享资源,实现了同步
• synchronized不能用来实现不同线程之间的消息传递(通信)
• Java提供了3个方法解决线程之间的通信问题
注意事项
均是java.lang.Object类的方法
都只能在同步方法或者同步代码块中使用,否则会抛出异常
【示例1】 准备生产者消费者问题
/*** 商品类*/
public class Product {
private String name;//馒头、玉米饼 private String color;//白色 黄色 public Product() {
}
public Product(String name, String color) {
this.name = name;
this.color = color;
}
//…..省略getter和setter方法 public String toString() {
return "Product{" +
"name='" + name + '\'' +
", color='" + color + '\'' +
'}';
}
}
/*** 生产者线程*/
public class ProduceRunnable implements Runnable {