2 u012427018 u012427018 于 2016.01.19 13:27 提问

多线程的线程关闭问题

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

3个回答

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.01.19 13: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
ouchao0727   2016.01.19 13:40

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

nie1421673255
nie1421673255   2016.01.19 14:35

好东西

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!