首页 > 编程语言 >算法题---五个线程排序输出

算法题---五个线程排序输出

时间:2024-06-20 19:32:28浏览次数:15  
标签:void ReentrantLock --- lock1 线程 new 排序 ThreadX

1、五个线程编号1、2、3、4、5,每个线程的执行完成时间不确定,要求按照排号顺序输出各个线程的结果,并且不能等所有线程执行完毕再排序输出,比如线程2先于线程1执行完了此时还不能输出。要等线程1输出完之后才能输出,其他线程以此类推

方案一、利用所得传递,创建五把锁 lock 1、2、3、4、5,线程1创建的时候lock1.lock 执行完毕后lock1.unlock 当线程2创建时候lock2.lock,输出方法里调用lock1.lock,输出完成之后执行lock1.unlock,再执行lock2.unlock,目的就是线程1把lock1释放之后 线程2才能获取到lock1然后才可以输出,后边的线程以此类推:

 public void test() {
        ReentrantLock lock1 = new ReentrantLock();
        ReentrantLock lock2 = new ReentrantLock();
        ReentrantLock lock3 = new ReentrantLock();
        ReentrantLock lock4 = new ReentrantLock();
        ReentrantLock lock5 = new ReentrantLock();

        Thread1 thread1 = new Thread1(lock1);
        Thread1 thread2 = new Thread2(lock1, lock2);
        Thread1 thread3 = new Thread3(lock2, lock3);
        Thread1 thread4 = new Thread4(lock3, lock4);
        Thread1 thread5 = new Thread5(lock4, lock5);
    }

 

class Thread1 extends Thread {
        ReentrantLock lock1;

        Thread1(ReentrantLock lock1) {
            this.lock1 = lock1;
            this.lock1.lock();
        }

        void doSomeThing() {

        }

        private void doPrint() {
            System.out.println("result1");
            lock1.unlock();
        }

        @Override
        public void run() {
            super.run();

            doSomeThing();
            doPrint();
        }
    }
class Thread2 extends Thread {
        ReentrantLock lock1;
        ReentrantLock lock2;

        Thread2(ReentrantLock lock1, ReentrantLock lock2) {
            this.lock1 = lock1;
            this.lock2 = lock2;
            this.lock2.lock();
        }

        void doSomeThing() {

        }

        private void doPrint() {
            lock1.lock();
            System.out.println("result1");
            lock1.unlock();
            lock2.unlock();
        }

        @Override
        public void run() {
            super.run();

            doSomeThing();
            doPrint();
        }
    }

 

方案二、利用线程的join方法,在本线程输出时使用前一个线程的join方法等待前一个执行完毕

 public void testX() {
        ThreadX thread1 = new ThreadX(null);
        ThreadX thread2 = new ThreadX(thread1);
        ThreadX thread3 = new ThreadX(thread2);
        ThreadX thread4 = new ThreadX(thread3);
        ThreadX thread5 = new ThreadX(thread4);
    }
class ThreadX extends Thread {
        Thread threadPre;

        ThreadX(Thread threadPre) {
            this.threadPre = threadPre;
        }

        void doSomeThing() {

        }

        private void doPrint() {
            try {
                if (threadPre != null) {
                    threadPre.join();
                }
                System.out.println("result1");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }

        @Override
        public void run() {
            super.run();

            doSomeThing();
            doPrint();
        }
    }

 

标签:void,ReentrantLock,---,lock1,线程,new,排序,ThreadX
From: https://www.cnblogs.com/bimingcong/p/18259356

相关文章

  • 第二章 - 第1节- 逻辑运算 - 课件
    1.逻辑运算符优先级以下是C++运算符的优先级表格,从高到低排列:优先级运算符描述结合性1::作用域解析从左到右2()[]->.函数调用、数组下标、成员访问从左到右3!~++--+-*&(type)sizeof逻辑非、按位取反、自增/自减、正/负号、间接......
  • 3、双分支判断 - 课件
    一、双分支的基本语法结构双分支结构,也称为if-else语句,其基本语法如下:if(判断表达式){//条件为真时执行的代码块}else{//条件为假时执行的代码块}说明:判断表达式是一个布尔表达式,它的值为真(true)或假(false)。如果判断表达式的值为真,执行if后......
  • 第二章 - 第1节- 逻辑运算 -课后习题
    习题练习第一题若P=true,Q=false,R=true,则逻辑表达式(P∧Q)∨(¬P∧R)的值为:A.trueB.falseC.0D.1第二题设A={1,2,3,4},B={2,4,6},则A∩(B∪{3,5})的结果为:A.{1,2,3,4,5,6}B.{2,3,4}C.{2,4}D.{3}第三题......
  • 2、拆位练习 - 课件
    基础知识一、拆位原理除法运算符/的拆位用法在拆位中,我们可以用除法运算符/来获取一个数字的高位部分。具体来说,就是用这个数字去除以一个适当的倍数(通常是10的幂),得到的商就是高位部分。例如,假设我们有一个数字n=1234,我们想要获取它的百位及以上的部分,就......
  • 微信小程序毕业设计-教学质量评价系统项目开发实战(附源码+论文)
    大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。......
  • 微信小程序源码-基于Java后端的教学质量评价系统的计算机毕业设计(附源码+论文)
    大家好!我是程序员一帆,感谢您阅读本文,欢迎一键三连哦。......
  • SAdb项目第二章-PySide6&&designer基础配置及应用
    接上文,本章来说说designer如何使用,并且如何转换成py文件打开designer控制台输入pyside6-designer就能打开创建一个Widget窗口打开后会自动弹出新建窗体选择Widget创建即可。也可以通过左上角的文件新建一个:designer简介desinger中的控件区域有各种控件......
  • Day56 代码随想录打卡|二叉树篇---删除二叉搜索树中的节点
    题目(leecodeT450):给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。一般来说,删除节点可分为两个步骤:首先找到需要删除的节点;如果找到了,删除它。方法:二叉搜索......
  • 【论文翻译】DeepSeek-Coder-V2: Breaking the Barrier of Closed-Source Models in C
    本翻译来自大模型翻译,如有不对的地方,敬请谅解引言开源社区通过开发诸如StarCoder(Li等人,2023b;Lozhkov等人,2024)、CodeLlama(Roziere等人,2023)、DeepSeek-Coder(Guo等人,2024)和Codestral(MistralAI,2024)等开源代码模型,在推进代码智能方面取得了显著进展。这些模型的性能已稳步接近......
  • 064篇 - 新兴趋势(Emerging Trends)【AIGC提示词工程】
    大家好,我是元壤教育的张涛,一名知识博主,专注于生成式人工智能(AIGC)各领域的研究与实践。我喜欢用简单的方法,帮助大家轻松掌握AIGC应用技术。我的愿景是通过我的文章和教程,帮助1000万人学好AIGC,用好AIGC。随着自然语言处理(NLP)和机器学习的快速发展,提示词工程在增强语言模型......