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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵家阳 中级黑马   /  2013-4-2 23:10  /  1249 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 赵家阳 于 2013-4-3 21:16 编辑



  1. class Demoo implements Runnable{
  2.         public void run(){
  3.                 for(int x=0;x<5;x++){
  4.                         System.out.println(Thread.currentThread().toString()+">>线程与运行>>"+x);
  5.                         Thread.yield();
  6.                 }
  7.         }
  8. }

  9. public class ThreadJoin {
  10.         public static void main(String[] args) throws InterruptedException
  11.         {
  12.                 Demoo d = new Demoo();
  13.                 Thread t1 = new Thread(d);
  14.                 Thread t2 = new Thread(d);
  15.                 t1.start();
  16.                 try{
  17.                         t1.sleep(5000);        //t1休息5秒        
  18.                 }catch(InterruptedException e){
  19.                         System.out.println(Thread.currentThread().getName()+"我被打断休息了");
  20.                 }
  21.                 t1.join();        
  22.                 /*t1会申请加入到运行中来,抢夺执行权。
  23.                  * 此时,main函数会将执行权交个t1,打断t1的休息时间,但是并没有抛出异常。为什么?
  24.                  * 执行完毕后,会接着休息。但是是谁在休息?
  25.                  */
  26.                 t2.start();               
  27.                 t2.join();
  28.                 /*
  29.                  * t2再次申请加入运行, 抢夺执行权,此时,main线程会将执行权交给
  30.                  * t2.
  31.                  */
  32.                 for(int x=0;x<7;x++){
  33.                         System.out.println(Thread.currentThread().getName()+">>>>run......"+x);
  34.                 }
  35.         }
  36. }
复制代码
开启两个线程,总共3个,在t1.start()之后,t1.sleep(5000);然后t1.join();此时,t1加入的执行序列,打断了睡眠
,然后t1运行完,然后休息了一段时间,接着其他两个线程搞完。

问题:1,t1.join();时,打断了其休息,为什么没有报异常??
2,t1搞完后,程序接着休息了几秒钟,此时,是谁在休息??

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

5 个回复

倒序浏览
本帖最后由 贾振凯 于 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().要让那个线程休息,就在哪个线程内部调用此方法.

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
贾振凯 发表于 2013-4-2 23:32
t1.sleep(5000); 这里其实是在让main方法休息,因为sleep方法是让当前正在执行的线程(即他的上下文线程main) ...

搞定了。:victory:
回复 使用道具 举报
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
回复 使用道具 举报
如果想中断另一个线程,只要持有那个线程的引用,调用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();
        }

}
回复 使用道具 举报
看得我一愣一愣的,搞了半天飞机。楼主 ,sleep 是个静态方法 ,不需要 对象调用, 容易引发误解。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马