黑马程序员技术交流社区
标题:
关于java多线程
[打印本页]
作者:
张庚
时间:
2013-2-9 13:50
标题:
关于java多线程
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()也不应该干涉它们的执行啊。 请高手指教?
作者:
游灿平
时间:
2013-2-10 19:55
这个和一个面试很相似,你可以理解为主线程一上来就获取CPU的执行权,过关斩将,一路杀到代码结束,所以当程序都结束了,m1,m2根本就没有机会抢到CPU的执行权。
首先多线程中是CPU来回切换执行不同线程的,同一时间只有一个线程能被执行,看你的疑惑是主线程根本就不释放执行权,其实这个是你代码的问题,因为你的代码太少了,一下子就执行完了,你可以不睡眠,写个for循环,循环一万次,在这期间,其他线程就有可能抢到CPU的执行权了
希望对你有帮助{:soso_e128:}
作者:
许鑫星
时间:
2013-2-10 22:29
其实这种情况因为main的线程执行语句过短,比另外两个线程先结束了,在打印log之前其他两个线程并没有得到充分执行时间。main并没有干涉m1,m2的执行而且m1和m2也不是没有获得执行机会,事实上都执行了,只是你没有打印出执行结束后的log。。。
作者:
陈科宇
时间:
2013-2-14 14:43
System.out.println(log); 这个语句过早地被执行了。这也是为什么你在主线程睡眠之后,可以完全打印,因为m1,m2的run方法执行完之后才打印了结果。
作者:
陈科宇
时间:
2013-2-14 14:47
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);
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2