首页技术文章正文

++如何使用多线程有序的输出结果【黑马java培训】

更新时间:2019年07月26日 10时55分03秒 来源:黑马程序员论坛

对于多线程,经常在笔试面试中被问到如何控制线程有序的输出,题目很简单。要求多线程+有序。
通过代码讲解,实现:
1)定义一个需要创建的线程。
package com.itheima.thread;

import java.util.LinkedHashMap;
import java.util.Map;

public class QueuePrint {
    public int targetNum=0;    //输出的总数量
    public int printOnce=0;    //当前次数输出数量
    private int nowNum=1;        //要打印的数量
    /**
     *
     * @param targetNum    输出的总数量
     * @param printOnce 当前次数输出数量

     */

    public QueuePrint(int targetNum, int printOnce) {
        super();
        this.targetNum = targetNum;
        this.printOnce = printOnce;
    }

    private int nextThreadNum=0;//next的下标数
    private int threadCount=0;//总的线程数量

    //map集合,存放线程,键是具体线程,值存放线程打印的顺序
    private Map<Thread,Integer> threads=new LinkedHashMap<Thread,Integer>();

    //添加线程
    public void setTh(Thread thread) {
        threads.put(thread, threadCount);
        threadCount++;
    }
    //运行线程
    public void run() {
        for (Thread thread : threads.keySet()) {
            thread.start();
        }
    }

    public synchronized void printNum() throws InterruptedException {
        //获取当前线程
        Thread currentThread=Thread.currentThread();
        //获取当前线程坐标
        int currentNum=threads.get(currentThread);
        //判断是否为期望线程
        if(currentNum==nextThreadNum) {
            for(int i=0;i<printOnce;i++) {
                System.out.println("当前线程:"+currentThread.getName()+":"+nowNum++);
                if(nowNum>targetNum) {
                    System.out.println("工作完成");
                    this.wait();
                }
            }
            //期望线程名+1
            nextThreadNum=(++nextThreadNum)%threadCount;
        }
    }

}2)创建一个执行类package com.itheima.thread;

class RunTest implements Runnable{
    QueuePrint ps;
    public RunTest(QueuePrint ps ) {
        this.ps=ps;
    }
    @Override
    public void run() {
        try {
            while(true) {
                ps.printNum();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
3)启动类package com.itheima.thread;

public class ThreadDemo {
    public static void main(String [] args) {
        //总数量10个,每个线程一次输出5个
        QueuePrint ps=new QueuePrint(10, 5);
      //增加加线程
        ps.setTh(new Thread(new RunTest(ps),"itcast"));
        ps.setTh(new Thread(new RunTest(ps),"itheima"));
        ps.setTh(new Thread(new RunTest(ps),"chuanzhi"));
        ps.run();
    }
}

输出结果:"C:\Program Files\Java\jdk1.8.0_171\bin\java" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:50108,suspend=y,server=n -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_171\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\rt.jar;C:\Users\Administrator\Desktop\Day40\target\classes;E:\maven\repository-2010\mvn_repo\repository1\mysql\mysql-connector-java\5.1.22\mysql-connector-java-5.1.22.jar;E:\maven\repository-2010\mvn_repo\repository1\com\alibaba\druid\1.0.9\druid-1.0.9.jar;C:\Program Files\Java\jdk1.8.0_171\lib\jconsole.jar;C:\Program Files\Java\jdk1.8.0_171\lib\tools.jar;E:\maven\repository-2010\mvn_repo\repository1\org\springframework\spring-core\5.0.0.RELEASE\spring-core-5.0.0.RELEASE.jar;E:\maven\repository-2010\mvn_repo\repository1\org\springframework\spring-jcl\5.0.0.RELEASE\spring-jcl-5.0.0.RELEASE.jar;E:\maven\repository-2010\mvn_repo\repository1\org\springframework\spring-jdbc\5.0.0.RELEASE\spring-jdbc-5.0.0.RELEASE.jar;E:\maven\repository-2010\mvn_repo\repository1\org\springframework\spring-tx\5.0.0.RELEASE\spring-tx-5.0.0.RELEASE.jar;E:\maven\repository-2010\mvn_repo\repository1\org\springframework\spring-beans\5.0.0.RELEASE\spring-beans-5.0.0.RELEASE.jar;E:\maven\repository-2010\mvn_repo\repository1\commons-beanutils\commons-beanutils\1.9.2\commons-beanutils-1.9.2.jar;E:\maven\repository-2010\mvn_repo\repository1\commons-logging\commons-logging\1.1.1\commons-logging-1.1.1.jar;E:\maven\repository-2010\mvn_repo\repository1\commons-collections\commons-collections\3.2.1\commons-collections-3.2.1.jar;E:\maven\repository-2010\mvn_repo\repository1\com\fasterxml\jackson\core\jackson-databind\2.3.3\jackson-databind-2.3.3.jar;E:\maven\repository-2010\mvn_repo\repository1\com\fasterxml\jackson\core\jackson-core\2.3.3\jackson-core-2.3.3.jar;E:\maven\repository-2010\mvn_repo\repository1\com\fasterxml\jackson\core\jackson-annotations\2.3.3\jackson-annotations-2.3.3.jar;E:\maven\repository-2010\mvn_repo\repository1\redis\clients\jedis\2.7.2\jedis-2.7.2.jar;E:\maven\repository-2010\mvn_repo\repository1\org\apache\commons\commons-pool2\2.3\commons-pool2-2.3.jar;C:\installSoft\developTools\intellij idea\IntelliJ IDEA 2017.2.4\lib\idea_rt.jar" com.Ryan.thread.ThreadDemoConnected to the target VM, address: '127.0.0.1:50108', transport: 'socket'当前线程:itcast:1当前线程:itcast:2当前线程:itcast:3当前线程:itcast:4当前线程:itcast:5当前线程:itheima:6当前线程:itheima:7当前线程:itheima:8当前线程:itheima:9当前线程:itheima:10工作完成



推荐了解热门学科

java培训 Python人工智能 Web前端培训 PHP培训
区块链培训 影视制作培训 C++培训 产品经理培训
UI设计培训 新媒体培训 产品经理培训 Linux运维
大数据培训 智能机器人软件开发




传智播客是一家致力于培养高素质软件开发人才的科技公司“黑马程序员”是传智播客旗下高端IT教育品牌。自“黑马程序员”成立以来,教学研发团队一直致力于打造精品课程资源,不断在产、学、研3个层面创新自己的执教理念与教学方针,并集中“黑马程序员”的优势力量,针对性地出版了计算机系列教材50多册,制作教学视频数+套,发表各类技术文章数百篇。

传智播客从未停止思考

传智播客副总裁毕向东在2019IT培训行业变革大会提到,“传智播客意识到企业的用人需求已经从初级程序员升级到中高级程序员,具备多领域、多行业项目经验的人才成为企业用人的首选。”

中级程序员和初级程序员的差别在哪里?
项目经验。毕向东表示,“中级程序员和初级程序员最大的差别在于中级程序员比初级程序员多了三四年的工作经验,从而多出了更多的项目经验。“为此,传智播客研究院引进曾在知名IT企业如阿里、IBM就职的高级技术专家,集中研发面向中高级程序员的课程,用以满足企业用人需求,尽快补全IT行业所需的人才缺口。

何为中高级程序员课程?

传智播客进行了定义。中高级程序员课程,是在当前主流的初级程序员课程的基础上,增加多领域多行业的含金量项目,从技术的广度和深度上进行拓展“我们希望用5年的时间,打造上百个高含金量的项目,覆盖主流的32个行业。”传智播客课程研发总监于洋表示。




黑马程序员热门视频教程【点击播放】

Python入门教程完整版(懂中文就能学会) 零起点打开Java世界的大门
C++| 匠心之作 从0到1入门学编程 PHP|零基础入门开发者编程核心技术
Web前端入门教程_Web前端html+css+JavaScript 软件测试入门到精通


在线咨询 我要报名
和我们在线交谈!