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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
socket多线程无法close的问题
现在遇到一个情景,处理数据的代码运行在A线程里,在B线程里对A中的socket的accept进行close,结果每次都卡在accpet那里,无法close成功,因为在本线程中,socket可以正常关闭,但是如果在B线程来关闭A线程中的的socket,则会出现线程碰撞问题。 想了很久,找到一个可行的方法是,设置一个静态变量,用于充当锁,如果过关闭锁,socket在本线程关闭。在B线程中对开关进行开...
C++多线程那些事
线程之间的关系一般有两种,一种是互斥,一种是同步,互斥可以表现为两个线程同时争夺同一个资源,同步可以表现为两个线程按一定次序完成一个任务(如A 完成任务的前半部分,紧接着需要线程B 完成线程的后半部分) 在C++中处理上面两种关系的常用方法是: 关键段、事件、互斥量、信号量。 注意C++开启新的线程一定使用_beginthreadex函数而不要使用CreateThread函数
MFC多线程内存泄漏问题&解决方法
在用visual studio进行界面编程时(如MFC),前台UI我们可以通过MFC的消息循环机制实现。而对于后台的数据处理,我们可能会用到多线程来处理。那么对于大多数人(尤其是我这种菜鸟),一个比较快捷的方法便是选择MFC多线程:AfxBeginThread或者CreateThread来进建立多线程。当一两个线程还是可以得,当有3个或者3个以上的线程出现时,极可能出现内存泄漏。原因分析如下:
多线程 DLL 回调函数问题,当应用程序退出时,有些操作并未完成,造成程序内存泄露,如何解决呢
问题描述如下:  现在有一个DLL库,里面定义了一个线程,线程里面又调用了应用程序中定义的回调函数,这样当应用程序退出时,应用程序中的回调函数还没有执行完毕,停在中间了,造成程序内存泄露,Debug内存泄露,而Release直接报错。伪代码如下:      Dll中定义个类B  Class B{  //类B里面定义了一个线程,如    CwinThread afxBeginThread(threa
关于opengl es 多线程渲染时应该注意的问题。
     在使用opengl es多线程渲染时,会出现多个线程同时使用一个共享的纹理或者其它可共享的资源。多线程访问共享资源,那不必多说,肯定需要锁或者其它保证线程安全的东西。        但在使用opengl es绘图指令时,并不是马上送给图形硬件去执行,而是先放到一个缓冲区中,等缓冲区满了再将指令送到图形硬件去执行,当指令比较少时,自然不会立即得到渲染的结果,这个时候得用glFinish指令...
服务端新开多线程使用HibernateSession 杜绝No session
自定义 多线程 no session OpenSessionInView
多线程应用中如何避免性能问题
多线程应用中避免性能问题的四个方面: 一  了解并发串行化: 理想的并发代码是一组完全I/O密集型任务。它们从不同步,很少计算---它们仅仅执行IO请求并等待。也就是多个不用进行同步的任务写成多线程方式进行处理的时候效率性能最高。 若你在写一组计算密集型或IO密集型并行线程时遇到了上述问题,并显示你只是将串行程序改为一个多线程的串行程序,结果会是一个更慢的程序,它使用更多的开销来
多线程系列提高(8)--取消与关闭
Java中没有提供任何机制来安全的终止线程,但它提供了中断,这是一种协作机制,能够使一个线程终止另一个线程的当前工作。
netty客户端引发的线程血案(一)
netty客户端引发的线程血案前言近日,在某个项目发现线程数量持续暴涨,最后OOM的问题,开发人员很头疼,刚好来问我,就协助分析了一下,观察服务器状态,CPU使用者正常,内存消耗持续增加,socket数量正常,通过jstack看,线程数量持续增加,大量线程处于epollWait函数调用中,线程状态是RUNNABLE,线程持续增加,很不正常,了解了项目的情况,发现新增了一个功能,就是使用了esl-cl
[java多线程]如何安全的退出线程
线程停止Thread提供了一个stop()方法,但是stop()方法是一个被废弃的方法。为什么stop()方法被废弃而不被使用呢?原因是stop()方法太过于暴力,会强行把执行一半的线程终止。这样会就不会保证线程的资源正确释放,通常是没有给与线程完成资源释放工作的机会,因此会导致程序工作在不确定的状态下那我们该使用什么来停止线程呢Thread.interrupt(),我们可以用他来停止线程,他是安全