zoukankan      html  css  js  c++  java
  • Java基础 线程的通信的三个方法/ 交替数数线程 / 生产者&消费者线程问题

    线程通讯笔记:

    /** 线程通信 三个方法:
     *      wait(): 调用该方法 是该调用的方法的线程释放共享资源的锁,进入等待状态,直至被唤醒
     *      notify() : 可以唤醒队列中的第一个等待同一共享资源的线程, 并使该线程退出等待队列,进入可运行状态
     *      notifyALL() : 全部唤醒,优先级最高的先执行!!!
     * ---------------------------------------------------------------
     *     例一:  使用两个线程 打印1-100,线程,两个线程交替打印
     *          ***方法: 一个线程先打印,打印完毕,先notifyALL,再接着 wait();
     *
     */

    线程交替数数代码:

    class PrintNum2 implements Runnable{
        int num=1;
        @Override
        public void run() {
            while(num<=30){
    
                synchronized (this) {
                    if(num<=30){
                        System.out.println(Thread.currentThread().getName()+" : "+num);
                        num++;
                    }
                    else{
                        break;
                    }
                    notifyAll();
                    try {
                        wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
    
                }
            }
        }
    }
    public class TestComm {
        public static void main(String[] args) {
            PrintNum2 p=new PrintNum2();
            Thread t1=new Thread(p);
            Thread t2=new Thread(p);
    
            t1.start();
            t2.start();
        }
    }

    交替数数的测试结果:

    Thread-0 : 1
    Thread-1 : 2
    Thread-0 : 3
    Thread-1 : 4
    Thread-0 : 5
    Thread-1 : 6
    Thread-0 : 7
    Thread-1 : 8
    Thread-0 : 9
    Thread-1 : 10
    Thread-0 : 11
    Thread-1 : 12
    Thread-0 : 13
    Thread-1 : 14
    Thread-0 : 15
    Thread-1 : 16
    Thread-0 : 17
    Thread-1 : 18
    Thread-0 : 19
    Thread-1 : 20
    Thread-0 : 21
    Thread-1 : 22
    Thread-0 : 23
    Thread-1 : 24
    Thread-0 : 25
    Thread-1 : 26
    Thread-0 : 27
    Thread-1 : 28
    Thread-0 : 29
    Thread-1 : 30
    View Code

     生产者&消费者线程问题:

    /** 生产者/消费者 问题
     *          1.生产者(Productor)将产品交给店员(Clerk),而消费者(Customer)从店员处取走产品
     *          2.店员一次只能持有固定数量的产品(比如:20),
     *          3.如果生产者试图生产更多的产品,店员会叫生产者停一下,如果店中有空位放产品了再通知生产者继续生产
     *          4.如果店中没有产品了,店员会告诉消费者等一下,如果店中有产品了再通知消费者来取走产品。
     * ----------------------------------
     *      分析:
     *      1.是否涉及多线程的同步问题!
     *      2.谁是共享数据!谁是共享代码块!
     */

    问题模型内容:

    代码演示: (每个消费者和生产者生产或者消费的产品个数都不超过10个 ,为了方便起见!太多的话, 输出结果太长了2333)

     1 class Clerk{  //店员
     2     int product;
     3     public synchronized void addProduct() {  //生产产品
     4         if(product>=20)
     5             try {
     6                 wait();
     7             } catch (InterruptedException e) {
     8                 e.printStackTrace();
     9             }
    10         else{
    11            product++;
    12             System.out.println(Thread.currentThread().getName()+" 生产了 "+product+"个产品!");
    13             notifyAll();
    14         }
    15     }
    16     public synchronized void consumeProduct(){
    17         if(product<=0){
    18             try {
    19                 wait();
    20             } catch (InterruptedException e) {
    21                 e.printStackTrace();
    22             }
    23         }
    24         else{
    25             System.out.println(Thread.currentThread().getName()+" 消费了第 "+product+"个产品!");
    26             product--;
    27             notifyAll();
    28         }
    29     }
    30 }
    31 class Productor implements Runnable{  //生产者 类
    32    Clerk clerk;
    33     int num;
    34     public Productor(Clerk clerk) {
    35         this.clerk = clerk;
    36         this.num=0;
    37     }
    38     public void run() {
    39         System.out.println("生产者开始生产产品!!");
    40         while (this.num<10){
    41             try {
    42                 Thread.currentThread().sleep(100);
    43             } catch (InterruptedException e) {
    44                 e.printStackTrace();
    45             }
    46             num++;
    47             clerk.addProduct();
    48         }
    49     }
    50 }
    51 
    52 class Consumer implements Runnable{
    53     Clerk clerk;
    54     int num;
    55     public Consumer(Clerk clerk) {
    56         this.clerk = clerk;
    57         this.num=0;
    58     }
    59     public void run(){
    60         System.out.println("消费者消费产品!");
    61         while (this.num<10){
    62             try {
    63                 Thread.currentThread().sleep(100);
    64             } catch (InterruptedException e) {
    65                 e.printStackTrace();
    66             }
    67             num++;
    68             clerk.consumeProduct();
    69         }
    70     }
    71 }
    72 
    73 public class Productor_Customer {
    74     public static void main(String[] args) {
    75         Clerk clerk=new Clerk();
    76         Productor p1=new Productor(clerk);
    77         Consumer c1=new Consumer(clerk);
    78 
    79         Thread t1=new Thread(p1," 生产者1 线程 ");
    80         Thread t3=new Thread(p1," 生产者2 线程 ");
    81         Thread t2=new Thread(c1," 消费者线程 ");
    82         t1.start();
    83         t2.start();
    84         t3.start();
    85     }
    86 }
    View Code

    结果输出:

    生产者开始生产产品!!
    生产者开始生产产品!!
    消费者消费产品!
     生产者2 线程  生产了 1个产品!
     生产者1 线程  生产了 2个产品!
     生产者2 线程  生产了 3个产品!
     消费者线程  消费了第 3个产品!
     生产者1 线程  生产了 3个产品!
     消费者线程  消费了第 3个产品!
     生产者2 线程  生产了 3个产品!
     生产者1 线程  生产了 4个产品!
     消费者线程  消费了第 4个产品!
     生产者2 线程  生产了 4个产品!
     生产者1 线程  生产了 5个产品!
     消费者线程  消费了第 5个产品!
     生产者1 线程  生产了 5个产品!
     生产者2 线程  生产了 6个产品!
     生产者1 线程  生产了 7个产品!
     消费者线程  消费了第 7个产品!
     生产者2 线程  生产了 7个产品!
     消费者线程  消费了第 7个产品!
     消费者线程  消费了第 6个产品!
     消费者线程  消费了第 5个产品!
     消费者线程  消费了第 4个产品!
    View Code
  • 相关阅读:
    学习笔记2
    带有循环的存储过程
    经典SQL语句大全
    关于职业的一些看法
    把dataTable表批量的写入数据库
    抽奖接口,每天只能抽奖3次,而且必须先登录才能抽奖的小程序
    调用获取学生信息的接口,保存到excel里面的小程序
    内置函数补充
    好用的模块
    网络编程
  • 原文地址:https://www.cnblogs.com/zhazhaacmer/p/9812866.html
Copyright © 2011-2022 走看看