IT评测·应用市场-qidao123.com

标题: Java多线程(三) [打印本页]

作者: 道家人    时间: 2022-9-16 17:13
标题: Java多线程(三)
Java多线程(三)


目录

五、线程的通信

5.1 wait() 与 notify() 和 notifyAll() 介绍:


5.2 wait() 的使用:

5.3 notify() / notifyAll() 的使用

5.4 经典例题:生产者/消费者问题

题目描述:
生产者(Productor)将产品交给店员(Clerk),而消费者(Customer)从店员处取走产品,店员一次只能持有固定数量的产品(比如:20),如果生产者试图生产更多的产品,店员会叫生产者停一下,如果店中有空位放产品了再通知生产者继续生产;如果店中没有产品了,店员会告诉消费者等一下,如 果店中有产品了再通知消费者来取走产品。
  1. class Clerk{
  2.     private int productCount = 0;
  3.     //生产产品
  4.     public synchronized void produceProduct() {
  5.         if(productCount < 20){
  6.             productCount++;
  7.             System.out.println(Thread.currentThread().getName() + ":开始生产第" + productCount + "个产品");
  8.             
  9.             notify();
  10.         }else{
  11.             //等待
  12.             try {
  13.                 wait();
  14.             } catch (InterruptedException e) {
  15.                 e.printStackTrace();
  16.             }
  17.         }
  18.     }
  19.     //消费产品
  20.     public synchronized void consumeProduct() {
  21.         if(productCount > 0){
  22.             System.out.println(Thread.currentThread().getName() + ":开始消费第" + productCount + "个产品");
  23.             productCount--;
  24.             notify();
  25.         }else{
  26.             //等待
  27.             try {
  28.                 wait();
  29.             } catch (InterruptedException e) {
  30.                 e.printStackTrace();
  31.             }
  32.         }
  33.     }
  34. }
  35. class Producer extends Thread{//生产者
  36.     private Clerk clerk;
  37.     public Producer(Clerk clerk) {
  38.         this.clerk = clerk;
  39.     }
  40.     @Override
  41.     public void run() {
  42.         System.out.println(getName() + ":开始生产产品.....");
  43.         while(true){
  44.             
  45.             try {
  46.                 Thread.sleep(10);
  47.             } catch (InterruptedException e) {
  48.                 e.printStackTrace();
  49.             }
  50.             clerk.produceProduct();
  51.         }
  52.     }
  53. }
  54. class Consumer extends Thread{//消费者
  55.     private Clerk clerk;
  56.     public Consumer(Clerk clerk) {
  57.         this.clerk = clerk;
  58.     }
  59.     @Override
  60.     public void run() {
  61.         System.out.println(getName() + ":开始消费产品.....");
  62.         while(true){
  63.             try {
  64.                 Thread.sleep(20);
  65.             } catch (InterruptedException e) {
  66.                 e.printStackTrace();
  67.             }
  68.             clerk.consumeProduct();
  69.         }
  70.     }
  71. }
  72. public class ProductTest {
  73.     public static void main(String[] args) {
  74.         Clerk clerk = new Clerk();
  75.         Producer p1 = new Producer(clerk);
  76.         p1.setName("生产者1");
  77.         Consumer c1 = new Consumer(clerk);
  78.         c1.setName("消费者1");
  79.         Consumer c2 = new Consumer(clerk);
  80.         c2.setName("消费者2");
  81.         p1.start();
  82.         c1.start();
  83.         c2.start();
  84.     }
  85. }
复制代码
六、JDK5.0新增多线程创建方式

6.1 多线程的创建方式之三:实现Callable接口

[code]//1.创建一个实现Callable的实现类class NumThread implements Callable{    //2.实现call方法,将此线程需要执行的操作声明在call()中    @Override    public Object call() throws Exception {        int sum = 0;        for (int i = 1; i




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4