首页 > 其他分享 >写一个多线程控制工人接活和工作的例子(使用synchronized wait notifyAll)

写一个多线程控制工人接活和工作的例子(使用synchronized wait notifyAll)

时间:2024-06-11 09:57:31浏览次数:23  
标签:synchronized int void nowWorkNum private num 接活 多线程 public


package org.example;

public class StudyWaitAndNotify {
    public static void main(String[] args) {
        WorkManNeedToDo a = new WorkMan();
        Leader l1 = new Leader(a, 25);
        Leader l2 = new Leader(a, 20);

        Tester t1 = new Tester(a, 25);
        Tester t2 = new Tester(a, 20);


        l1.start();
        l2.start();

        t1.start();
        t2.start();

    }
}

class Leader extends Thread {
    private WorkManNeedToDo workManNeedToDo ;
    private int num ;

    public Leader (WorkManNeedToDo a, int num){
        workManNeedToDo=a;
        this.num = num;

    }
    @Override
    public void run() {
        workManNeedToDo.getWork(num);
    }
}

class Tester extends Thread {
    private WorkManNeedToDo workManNeedToDo ;
    private int num ;
    public Tester (WorkManNeedToDo a, int num){
        workManNeedToDo=a;
        this.num = num;

    }
    @Override
    public void run() {
        workManNeedToDo.doWork(num);
    }
}

class WorkMan implements WorkManNeedToDo {
    private Object lock = new Object();
    private int MAXWORKNUM = 35;// 最多45人天
    private int nowWorkNum ;


    @Override
    public void doWork(int num) {
        System.out.println("开始准备工作,当前工作量:"+nowWorkNum+"要完成的工作:"+num);
        synchronized (lock){
            // nowWorkNum 随时可能边 先锁住
            while (num > nowWorkNum){
                // 要干的活儿得小于现在有的活儿 先锁住
                System.out.println("要干的活儿得小于现在有的活儿 先锁住");
                try {
                    lock.wait();
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
            nowWorkNum = nowWorkNum-num;
            System.out.println("工作后,当前工作量:"+nowWorkNum+"已经完成的工作:"+num);
            lock.notifyAll();
        }
    }

    @Override
    public void getWork(int num) {
        System.out.println("开始准备接活儿,当前工作量:"+nowWorkNum+"要接手的工作:"+num);
        synchronized (lock){
            // nowWorkNum 随时可能变 先锁住
            while (num+nowWorkNum > MAXWORKNUM){
                // 活儿太多了 没发接 先干完别的再说
                System.out.println("活儿太多了 没发接 先干完别的再说");
                try {
                    lock.wait();
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
            nowWorkNum = nowWorkNum+num;
            System.out.println("接活后,当前工作量:"+nowWorkNum+"已经接手的工作:"+num);
            lock.notifyAll();
        }
    }
}
interface WorkManNeedToDo {
    void doWork(int num);// 工作 减少工作量
    void getWork(int num);// 接受任务 增加工作量
}

参考帖子https://www.cnblogs.com/moongeek/p/7631447.html

标签:synchronized,int,void,nowWorkNum,private,num,接活,多线程,public
From: https://www.cnblogs.com/zyaocn/p/17940615

相关文章

  • JUC及多线程,线程安全
    JUC及多线程返回到Java开发知识汇总目录@程序员猴哥1.什么是JUCjava.util.concurrent:核心并发工具类。java.util.concurrent包含了许多线程安全,测试良好,高性能的并发模块。创建java.util.concurrent的目的就是要实现Collection框架对数据结构所执行的并发操作。核心......
  • 【QT5】<总览五> QT多线程、TCP/UDP
    文章目录前言一、QThread多线程二、QT中的TCP编程1.TCP简介2.服务端程序编写3.客户端程序编写4.服务端与客户端测试三、QT中的UDP编程1.UDP简介2.UDP单播与广播程序前言承接【QT5】<总览四>QT常见绘图、图表及动画。若存在版权问题,请联系作者删除!一、QThre......
  • python 多任务之多线程
    多线程线程是程序执行的最小单位,实际上进程只负责分配资源,而利用这些资源执行程序的是线程,也就是说进程是线程的容器,一个进程中最少有一个线程来负责执行程序,它可以与同属一个进程的其它线程共享进程所拥有的全部资源 为什么要选择线程,而不选择进程进程:就像同时和两个人......
  • Python实现投递多线程任务
    使用Python的apscheduler库中的BackgroundScheduler实现投递多线程任务的示例代码。这个示例将展示如何根据任务ID投递和停止任务,设置任务同时执行的上限,以及删除全部任务。首先,确保你已经安装了apscheduler库:``pipinstallapscheduler``代码示例:``fromapscheduler.sched......
  • Python简单实现多线程例子
    使用Python实现多线程的例子,演示如何在主线程内分别启动ABC三个线程,并实现启动和停止指定线程的功能``importthreadingimporttime#定义一个全局标志,用于控制线程的运行状态stop_thread_A=Falsestop_thread_B=Falsestop_thread_C=False#线程A的函数......
  • 多线程、队列、装饰器统计时间
    """一个列表中有100个url地址(每个请求0.5秒),设计一个程序,获取列表的url地址使用5个线程去发送这100个请求,计算出总共请求的时间"""importqueueimporttimefrommultiprocessing.poolimportThreadPooldefdownload(q:queue.Queue):whilenotq.empty():......
  • 【Linux多线程】线程的终止、等待和分离
    文章目录线程终止正常退出return退出pthread_exit函数终止线程pthread_cancel强制终止线程进程终止线程等待为什么需要等待线程?pthread_join函数分离线程pthread_detach函数线程终止下面给出终止线程的三种方式:正常退出:线程执行完它的函数之后return自动结......
  • 多线程interrupt()方法
    interrupt()方法:配合isInterrupted()方法可以合理打断线程,让线程处理好事务后停止。打算一个非阻塞状态的线程效果publicclasstest{publicstaticvoidmain(String[]args){Runnabler=()->{while(true){booleaninterrup......
  • 【Go-多线程】Golang的channel实现消息的批量处理
    【Go-多线程】Golang的channel实现消息的批量处理。当消息量特别大时,使用kafka之类的messagequeue是首选,但这是更加轻量的方案channelx.go//这个方案需要实现以下几点://1.消息聚合后处理(最大条数为BatchSize),核心://(1)带buffer的channel相当于一个FIFO的队列//(2)多个常驻的gorou......
  • 多线程实现爬取图片
    importosimportthreadingimportrequestsfromget_img_urlimportget_img_url#下载单张图片方法,方法入参为图片url地址和图片名称defdownload_image(url,filename):response=requests.get(url)withopen(filename,'wb')asf:f.write(respon......