java-多线程的线程关闭问题

问题描述

多线程的线程关闭问题

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

解决方案

首先,线程不存在关闭这种说法,线程是有生命周期的,线程一旦启动后,当它的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操作而非正常结束。

解决方案二:

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

解决方案三:

好东西

时间: 2024-08-02 12:02:44

java-多线程的线程关闭问题的相关文章

学习Java多线程之线程定义、状态和属性_java

一 .线程和进程 1. 什么是线程和进程的区别: 线程是指程序在执行过程中,能够执行程序代码的一个执行单元.在java语言中,线程有四种状态:运行 .就绪.挂起和结束. 进程是指一段正在执行的程序.而线程有事也被成为轻量级的进程,他得程序执行的最小单元,一个进程可以拥有多个线程,各个线程之间共享程序的内功空间(代码段.数据段和堆空间)及一些进程级的资源(例如打开的文件),但是各个线程都拥有自己的棧空间. 2. 为何要使用多进程 在操作系统级别上来看主要有以下几个方面: - 使用多线程可以减少程序

Java多线程之线程间协作 notify与wait的使用

(转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景        Java多线程操作运用很广,特别是在android程序方面.线程异步协作是多线程操作的难点也是关键,也是找工作面试经常考到的地方.下面分享一下我的使用心得. 介绍几个关键字: synchronized:线程锁,使得系统只执行当前线程. notifyAll():唤醒其它被锁住的线程 wait():挂起线程 ExecutorService exec=Executors.newCachedT

java多线程之线程安全的单例模式_java

概念: java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种. 单例模式有一下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例.这些应用都或多或少具有资源管理器的功能.每台计算机可以有若干个打印机,但只能有一个Printer

Java多线程和线程池

版权声明:本文为博主原创文章,转载注明出处http://blog.csdn.net/u013142781 1.为什么要使用线程池 在Java中,如果每个请求到达就创建一个新线程,开销是相当大的.在实际使用中,服务器在创建和销毁线程上花费的时间和消耗的系统资源都相当大,甚至可能要比在处理实际的用户请求的时间和资源要多的多.除了创建和销毁线程的开销之外,活动的线程也需要消耗系统资源.如果在一个jvm里创建太多的线程,可能会使系统由于过度消耗内存或"切换过度"而导致系统资源不足.为了防止资源

java 多线程和线程池

● 多线程 多线程的概念很好理解就是多条线程同时存在,但要用好多线程确不容易,涉及到多线程间通信,多线程共用一个资源等诸多问题. 使用多线程的优缺点: 优点: 1)适当的提高程序的执行效率(多个线程同时执行). 2)适当的提高了资源利用率(CPU.内存等). 缺点: 1)占用一定的内存空间. 2)线程越多CPU的调度开销越大. 3)程序的复杂度会上升. 对于多线程的示例代码感兴趣的可以自己写Demo啦,去运行体会,下面我主要列出一些多线程的技术点. synchronized 同步块大家都比较熟悉

Java多线程的线程守护两个例子

  核心说明:理解这句话下面可以不看了. 守护与其他线程同时执行,当正在运行的线程都是守护线程时,Java 虚拟机退出. 守护线程与普通线程写法上基本么啥区别,调用线程对象的方法setDaemon(true),则可以将其设置为守护线程. 守护线程使用的情况较少,但并非无用,举例来说,JVM的垃圾回收.内存管理等线程都是守护线程.还有就是在做数据库应用时候,使用的数据库连接池,连接池本身也包含着很多后台线程,监控连接个数.超时时间.状态等等. setDaemon方法的详细说明: public fi

java多线程的线程数统计

问题描述 importjava.net.*;importjava.util.Set;importjava.io.*;classJabberClientThreadextendsThread{privateSocketsocket;privateBufferedReaderin;privatePrintWriterout;privatestaticintcounter=0;privateintid=counter++;privatestaticintthreadcount;publicstatic

java 多线程-线程通信实例讲解_java

线程通信的目标是使线程间能够互相发送信号.另一方面,线程通信使线程能够等待其他线程的信号. 通过共享对象通信 忙等待 wait(),notify()和 notifyAll() 丢失的信号 假唤醒 多线程等待相同信号 不要对常量字符串或全局对象调用 wait() 通过共享对象通信 线程间发送信号的一个简单方式是在共享对象的变量里设置信号值.线程 A 在一个同步块里设置 boolean 型成员变量 hasDataToProcess 为 true,线程 B 也在同步块里读取 hasDataToProc

Java多线程:“JUC锁”02之互斥锁ReentrantLock

ReentrantLock介绍 ReentrantLock是一个可重入的互斥锁,又被称为"独占锁". 顾名思义,ReentrantLock锁在同一个时间点只能被一个线程锁持有:而可重入的意思是, ReentrantLock锁,可以被单个线程多次获取. ReentrantLock分为"公平锁"和"非 公平锁".它们的区别体现在获取锁的机制上是否公平."锁"是为了保护竞争资源, 防止多个线程同时操作线程而出错,ReentrantL