多线程经典问题
•发布于   •作者 fly唐朝的天空(唐秋果)  •388 次浏览  •最后一次编辑是   •来自 资讯

问题描述:

一个关于线程的经典面试题,要求用三个线程,按顺序打印1,2,3,4,5.... 71,72,73,74, 75.

线程1先打印1,2,3,4,5, 然后是线程2打印6,7,8,9,10, 然后是线程3打印11,12,13,14,15. 接着再由线程1打印16,17,18,19,20....以此类推, 直到线程3打印到75。

/** 
 * 要求创建三个线程,输出1-75, 
 * 最开始第一个线程输出1-5,第二个输出6-10,第三个输出11-15 
 * 接着再第一个线程输出16-20...就这样循环下去,直到打印出75个数 
 * @author qiaoxueshi 
 * 
 */  
public class Test {  
    static class Printer implements Runnable{  
        static int num = 1; //开始数字  
        static final int END = 75;  
        int id;  
        Object o; //这就是三个线程的“公证人”,有点寒酸吧  
          
        public Printer(int id, Object o) {  
            this.id = id;  
            this.o = o;  
        }  
          
        @Override  
        public void run(){  
            synchronized (o) {  
                while(num <= END){  
                    if(num / 5 % 3 == id){ //如果是属于自己的数,依次打印出来五个  
                        System.out.print(id + ":");  
                        for(int i = 0; i < 5; i++){  
                            System.out.print(num++ + ", ");  
                        }  
                        System.out.println();  
                          
                        o.notifyAll();//放弃CPU使用权,唤醒在o对象的等待队列上的线程  
                    }else{  
                        try {  
                            o.wait(); //如果不属于自己的数,把当前线程挂在o这个对象的等待队列上(也放弃了CPU使用权),等待唤醒  
                        } catch (InterruptedException e) {  
                            System.out.println("id" + "被打断了");  
                        }  
                    }  
                }  
            }  
        }  
    }  
      
      
    public static void main(String[] args) {  
        //下面可以不按0,1,2的顺序来,而且在两两中间随便sleep(),都会正确打印出来  
        Object o = new Object();  
        new Thread( new Printer(0, o)).start();  
        new Thread( new Printer(1, o)).start();  
        new Thread( new Printer(2, o)).start();  
    }  
}  

运行结果如下:


0 回复
回到顶部

©2017 Powered by 三十三行伪代码
皖ICP备17005175号-3