u012427018
鼬佐
2016-01-19 05:27
采纳率: 40%
浏览 2.6k
已采纳

多线程的线程关闭问题

一段程序,线程一里面开了线程二,线程二里面又开了线程三和线程四,怎么在线程一继续执行的情况下,关闭线程二、三、四

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • wojiushiwo945you
    毕小宝 2016-01-19 05:59
    已采纳

    首先,线程不存在关闭这种说法,线程是有生命周期的,线程一旦启动后,当它的run方法执行完成后,线程就会自动销毁的。
    其次,按你的描述,如果想让某个线程结束的话,就是让线程的run方法非正常结束。
    java的线程类Thread有interrupt()方法,可以让线程的启动者中断该线程,同时需要设计线程的run方法中能够响应中断异常。
    测试程序如下:

     /**
     * 线程一里面开了线程二,线程二里面又开了线程三和线程四,
     * 怎么在线程一继续执行的情况下,关闭线程二、三、四
     * 线程一:此处为main线程
     * 线程二:Thread2类型的线程
     * 线程三、四:Thread3类型的线程
     * @author 金涛
     *
     */
    public class ThreadInterruptTest {
    
        public static void main(String[] args) {
            Thread t1 = new Thread2();
            t1.start();
            //1秒后中断线程二
            try {
                Thread.sleep(1000);
                t1.interrupt();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
            //main线程即线程一无限循环
            while(true){
    
            }
        }
    }
    
     /**
      * 线程二开启线程三、四
      * @author 金涛
      *
      */
     class Thread2 extends Thread{
    
        @Override
        public void run() {
            System.out.println("线程二启动成功");
            Thread3 t3 = new Thread3();
            Thread3 t4 = new Thread3();
            t3.start();
            t4.start();
            //线程继续的条件是没有外界线程中断该线程
            while(!this.isInterrupted()){
    
            }
            //外界中断了线程二的话,则线程二同时中断线程三、四
            t3.interrupt();
            t4.interrupt();
            System.out.println("线程二被外界中断而结束");
        }
    
    }
    
    class Thread3 extends Thread{
        public void run() {
            System.out.println("线程"+Thread.currentThread().getName()+"启动成功。");
            while(!this.isInterrupted()){
    
            }
            System.out.println("线程"+Thread.currentThread().getName()+"被外界中断而结束。");
        }
    }
    

    测试结果:线程一继续运行,而线程二、三、四都因为外界调用了interrupt操作而非正常结束。
    图片说明

    点赞 评论
  • ouchao0727
    xiao哦草 2016-01-19 05:40

    个人觉得可以在线程1中设置一个信号,在线程二中设置pthread-join,当你1发送结束信号的时候,三四线程pthread-exit掉自己,这个时候回到线程2
    再pthread-exit自己,函数的中间的"-" 换成下划线,不过本人没尝试,不知道可以不可以

    点赞 评论
  • nie1421673255
    nie1421673255 2016-01-19 06:35

    好东西

    点赞 评论

相关推荐