黑马程序员技术交流社区
标题:
java多线程join()方法疑惑。。。。
[打印本页]
作者:
赵家阳
时间:
2013-4-2 23:10
标题:
java多线程join()方法疑惑。。。。
本帖最后由 赵家阳 于 2013-4-3 21:16 编辑
class Demoo implements Runnable{
public void run(){
for(int x=0;x<5;x++){
System.out.println(Thread.currentThread().toString()+">>线程与运行>>"+x);
Thread.yield();
}
}
}
public class ThreadJoin {
public static void main(String[] args) throws InterruptedException
{
Demoo d = new Demoo();
Thread t1 = new Thread(d);
Thread t2 = new Thread(d);
t1.start();
try{
t1.sleep(5000); //t1休息5秒
}catch(InterruptedException e){
System.out.println(Thread.currentThread().getName()+"我被打断休息了");
}
t1.join();
/*t1会申请加入到运行中来,抢夺执行权。
* 此时,main函数会将执行权交个t1,打断t1的休息时间,但是并没有抛出异常。为什么?
* 执行完毕后,会接着休息。但是是谁在休息?
*/
t2.start();
t2.join();
/*
* t2再次申请加入运行, 抢夺执行权,此时,main线程会将执行权交给
* t2.
*/
for(int x=0;x<7;x++){
System.out.println(Thread.currentThread().getName()+">>>>run......"+x);
}
}
}
复制代码
开启两个线程,总共3个,在t1.start()之后,t1.sleep(5000);然后t1.join();此时,t1加入的执行序列,打断了睡眠
,然后t1运行完,然后休息了一段时间,接着其他两个线程搞完。
问题:1,t1.join();时,打断了其休息,为什么没有报异常??
2,t1搞完后,程序接着休息了几秒钟,此时,是谁在休息??
作者:
贾振凯
时间:
2013-4-2 23:32
本帖最后由 贾振凯 于 2013-4-2 23:41 编辑
t1.sleep(5000); 这里其实是在让main方法休息,因为sleep方法是让当前正在执行的线程(即他的上下文线程main)休息.
所以整体的执行流程是
t1开始执行
main线程休息5秒钟
5秒之内t1已经执行完所以接下来这句t1.jion()没有意义
然后t2开启
接着t2.join()阻塞主线程
最后组线程执行
另外不推荐用t1.sleep(5000)这种方式来阻塞线程,容易造成误解,理解为谁调用谁阻塞!!!!!!!!
规范的写法是Thread.sleep().要让那个线程休息,就在哪个线程内部调用此方法.
作者:
赵家阳
时间:
2013-4-3 00:02
贾振凯 发表于 2013-4-2 23:32
t1.sleep(5000); 这里其实是在让main方法休息,因为sleep方法是让当前正在执行的线程(即他的上下文线程main) ...
搞定了。:victory:
作者:
黄玉昆
时间:
2013-4-3 12:26
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
作者:
蓝色骨头
时间:
2013-4-3 12:50
如果想中断另一个线程,只要持有那个线程的引用,调用interrupt()就可以了
class MyRunable implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public class test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MyRunable myRunnable = new MyRunable();
Thread t = new Thread(myRunnable);
t.start();
t.interrupt();
}
}
作者:
刘渝灵
时间:
2013-4-3 13:43
看得我一愣一愣的,搞了半天飞机。楼主 ,sleep 是个静态方法 ,不需要 对象调用, 容易引发误解。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2