A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张庚 中级黑马   /  2013-2-9 13:50  /  1480 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class Machine extends Thread{     
        private static StringBuffer log = new StringBuffer();            
        private static int count = 0 ;           
        public void run(){         
                for(int a = 0;a<20;a++){            
                log.append(currentThread().getName()+":"+a+" ");            
                        if(++count%10==0){                 
                                log.append("\n");            
                        }         
                }     
        }           
        public static void main(String[] args) {         
                Thread main = Thread.currentThread();         
                System.out.println(main.getName());         
                Machine machine1 = new Machine();         
                Machine machine2 = new Machine();         
                machine1.setName("m1");         
                machine2.setName("m2");         
                machine1.start();         
                machine2.start();         
                /* try {            
                        Thread.sleep(2000);            
                } catch (Exception e) {            
                        e.printStackTrace();         
                }         */         
                System.out.println(main.getPriority());//打印主线程优先级         
                System.out.println(machine1.getPriority());//打印m1线程优先级         
                System.out.println(machine2.getPriority());//打印m2线程优先级         
                System.out.println(log);     
        }
}
以上代码中创建了m1、m2线程,还有本身的线程main,为什么使用了try代码块中的主线程休眠才可以看到m1、m2执行run()方法的结果?而将try block注释掉之后m1、m2的run()似乎没怎么执行。  个人理解似乎是main主线程急于结束,没能给m1、m2线程执行的机会。但按道理应该是m1、m2并发执行,main()也不应该干涉它们的执行啊。 请高手指教?

4 个回复

倒序浏览
这个和一个面试很相似,你可以理解为主线程一上来就获取CPU的执行权,过关斩将,一路杀到代码结束,所以当程序都结束了,m1,m2根本就没有机会抢到CPU的执行权。
首先多线程中是CPU来回切换执行不同线程的,同一时间只有一个线程能被执行,看你的疑惑是主线程根本就不释放执行权,其实这个是你代码的问题,因为你的代码太少了,一下子就执行完了,你可以不睡眠,写个for循环,循环一万次,在这期间,其他线程就有可能抢到CPU的执行权了
希望对你有帮助{:soso_e128:}
回复 使用道具 举报
其实这种情况因为main的线程执行语句过短,比另外两个线程先结束了,在打印log之前其他两个线程并没有得到充分执行时间。main并没有干涉m1,m2的执行而且m1和m2也不是没有获得执行机会,事实上都执行了,只是你没有打印出执行结束后的log。。。
回复 使用道具 举报
  System.out.println(log);  这个语句过早地被执行了。这也是为什么你在主线程睡眠之后,可以完全打印,因为m1,m2的run方法执行完之后才打印了结果。
回复 使用道具 举报
public static void main(String[] args) {         
            Thread main = Thread.currentThread();         
            System.out.println(main.getName());         
            Machine machine1 = new Machine();         
            Machine machine2 = new Machine();         
            machine1.setName("m1");         
            machine2.setName("m2");   
            machine1.start();         
            machine2.start();   
            try {
                    /*
                     * 使用了join方法就可以了,主线程的打印语句一定会等待两个线程
                     * 的run方法执行完毕再执行。
                     */
                                machine1.join();
                                machine2.join();
                        } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
            
                 
            System.out.println(log);   

    }
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马