博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
启动3个线程轮番打印递增的数字
阅读量:6833 次
发布时间:2019-06-26

本文共 3026 字,大约阅读时间需要 10 分钟。

hot3.png

启动3个线程打印递增的数字, 线程1先打印1,2,3,4,5, 然后是线程2打印6,7,8,9,10, 然后是线程3打印11,12,13,14,15. 接着再由线程1打印16,17,18,19,20....以此类推, 直到打印到75. 程序的输出结果应该为:

线程1: 1

线程1: 2

线程1: 3

线程1: 4

线程1: 5

 

线程2: 6

线程2: 7

线程2: 8

线程2: 9

线程2: 10

...

 

线程3: 71

线程3: 72

线程3: 73

线程3: 74

线程3: 75

public class PrintNoDemo {    private static int printNO = 1;    private static int printThread = 1;    private static Condition condition1;    private static Condition condition2;    private static Condition condition3;    private static ReentrantLock lock = new ReentrantLock();        public static void main(String[] args){        condition1 = lock.newCondition();        condition2 = lock.newCondition();        condition3 = lock.newCondition();                for(int i=0; i<3; i++){            Thread thread = new Thread(new Runnable(){                @Override                public void run() {                    while(printNO <= 75){                        printNo();                    }                }            },"线程"+(i+1));            thread.start();        }    }    public static void printNo() {        try {            lock.lock();            String threadName = Thread.currentThread().getName();            //判断线程,选择等待Condition            if(!threadName.equals("线程"+printThread)){                if(threadName.equals("线程1")){                    condition1.await();                } else                 if(threadName.equals("线程2")){                    condition2.await();                } else                if(threadName.equals("线程3")){                    condition3.await();                }            }                        //处理打印            for (int i = 0; i < 5; i++) {                if(printNO > 75){                    break;                }                System.out.println(Thread.currentThread().getName() +":"+ printNO++);            }            //获取下一个打印线程            printThread = printThread%3 +1;                        if(threadName.equals("线程1")){                condition2.signal();            }else             if(threadName.equals("线程2")){                condition3.signal();            }else             if(threadName.equals("线程3")){                condition1.signal();            }            //            lock.notifyAll();        } catch (InterruptedException e) {            e.printStackTrace();        } finally {            lock.unlock();        }    }}

网友实现方法

class NumberPrinter extends Thread {    static int c = 0;    static int state = 0;    private int id;    @Override    public synchronized void run() {        while (state < 15) {            if (state % 3 == id) {                for (int j = 0; j < 5; j++) {                    c++;                    System.out.format("Thread %d: %d %n", id, c);                }                state++;;             }        }    }    public NumberPrinter(int id) {        this.id = id;    }    public static void main(String[] args) {        for (int i = 0; i < 3; i++) {            new NumberPrinter(i).start();        }    }}

转载于:https://my.oschina.net/u/2501904/blog/534833

你可能感兴趣的文章
Jquery实现鼠标拖拽效果
查看>>
标准差(standard deviation)和标准误差(standard error)你能解释清楚吗?
查看>>
[WPF]有滑动效果的进度条
查看>>
妙趣横生的算法--顺序表
查看>>
Xcode 5.0.2 下载地址
查看>>
Z.Studio高级成衣定制(双井店)价格,地址(图)-北京-大众点评网
查看>>
定时器
查看>>
【LeetCode】120. Triangle (3 solutions)
查看>>
boost::interprocess(1)
查看>>
Noi2011 : 智能车比赛
查看>>
设置tomcat 编译文件位置【转】
查看>>
NOI2010 : 超级钢琴
查看>>
sine曲线向前运动
查看>>
ios的@property属性和@synthesize属性(转)
查看>>
四种常见的 POST 提交数据方式
查看>>
编写一个C语言函数,要求输入一个url,输出该url是首页、目录页或者其他url
查看>>
ubuntu 14.04 chromium,firefox 怎样正确安装Adobe flash player
查看>>
Linux makefile 教程 很具体,且易懂
查看>>
linux用dd测试磁盘速度
查看>>
八大排序算法总结
查看>>