`

Java 终止线程方法

阅读更多
终止线程的三种方法

    有三种方法可以使终止线程。

    1.  使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。

    2.  使用stop方法强行终止线程(这个方法不推荐使用,因为stop和suspend、resume一样,也可能发生不可预料的结果)。

    3.  使用interrupt方法中断线程。
1. 使用退出标志终止线程

    当run方法执行完后,线程就会退出。但有时run方法是永远不会结束的。如在服务端程序中使用线程进行监听客户端请求,或是其他的需要循环处理的任务。在这种情况下,一般是将这些任务放在一个循环中,如while循环。如果想让循环永远运行下去,可以使用while(true){……}来处理。但要想使while循环在某一特定条件下退出,最直接的方法就是设一个boolean类型的标志,并通过设置这个标志为true或false来控制while循环是否退出。下面给出了一个利用退出标志终止线程的例子。

package chapter2;

public class ThreadFlag extends Thread
{
    public volatile boolean exit = false;

    public void run()
    {
        while (!exit);
    }
    public static void main(String[] args) throws Exception
    {
        ThreadFlag thread = new ThreadFlag();
        thread.start();
        sleep(5000); // 主线程延迟5秒
        thread.exit = true;  // 终止线程thread
        thread.join();
        System.out.println("线程退出!");
    }
}


    在上面代码中定义了一个退出标志exit,当exit为true时,while循环退出,exit的默认值为false.在定义exit时,使用了一个Java关键字volatile,这个关键字的目的是使exit同步,也就是说在同一时刻只能由一个线程来修改exit的值,

    2. 使用stop方法终止线程

    使用stop方法可以强行终止正在运行或挂起的线程。我们可以使用如下的代码来终止线程:

thread.stop();


    虽然使用上面的代码可以终止线程,但使用stop方法是很危险的,就象突然关闭计算机电源,而不是按正常程序关机一样,可能会产生不可预料的结果,因此,并不推荐使用stop方法来终止线程。

    3. 使用interrupt方法终止线程

    使用interrupt方法来终端线程可分为两种情况:

    (1)线程处于阻塞状态,如使用了sleep方法。

    (2)使用while(!isInterrupted()){……}来判断线程是否被中断。

    在第一种情况下使用interrupt方法,sleep方法将抛出一个InterruptedException例外,而在第二种情况下线程将直接退出。下面的代码演示了在第一种情况下使用interrupt方法。

package chapter2;

public class ThreadInterrupt extends Thread
{
    public void run()
    {
        try
        {
            sleep(50000);  // 延迟50秒
        }
        catch (InterruptedException e)
        {
            System.out.println(e.getMessage());
        }
    }
    public static void main(String[] args) throws Exception
    {
        Thread thread = new ThreadInterrupt();
        thread.start();
        System.out.println("在50秒之内按任意键中断线程!");
        System.in.read();
        thread.interrupt();
        thread.join();
        System.out.println("线程已经退出!");
    }
}


    上面代码的运行结果如下:

    在50秒之内按任意键中断线程!

    sleep interrupted
    线程已经退出!


    在调用interrupt方法后, sleep方法抛出异常,然后输出错误信息:sleep interrupted.

    注意:在Thread类中有两个方法可以判断线程是否通过interrupt方法被终止。一个是静态的方法interrupted(),一个是非静态的方法isInterrupted(),这两个方法的区别是interrupted用来判断当前线是否被中断,而isInterrupted可以用来判断其他线程是否被中断。因此,while (!isInterrupted())也可以换成while (!Thread.interrupted())。


文章转载自网管之家:http://www.bitscn.com/pdb/java/200904/161228_3.html
分享到:
评论
1 楼 xly_971223 2013-10-12  
引用
因此,while (!isInterrupted())也可以换成while (!Thread.interrupted())。

Thread.interrupted()这个方法会返回当前线程的中断状态 然后把状态复位为false
跟isInterrupted()方法不能互换

相关推荐

    java多线程经典案例

    Java提供了三种线程状态:新建(New)、运行(Runnable)、阻塞(Blocked)、等待(Waiting)、超时等待(Timed Waiting)和终止(Terminated)。阻塞状态通常发生在线程等待I/O操作完成、调用sleep()方法、等待锁...

    Java多线程机制(讲述java里面与多线程有关的函数)

    挂起线程通常通过调用`sleep()`或`wait()`方法实现,恢复线程可能通过`notify()`或`notifyAll()`唤醒,终止线程则可以通过`interrupt()`方法发送中断请求,但线程本身需要检查`isInterrupted()`或`...

    Java多线程编程核心技术_完整版_java_

    线程有五种基本状态:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和终止(Terminated)。线程的生命周期包括创建、启动、运行、等待、唤醒和结束等过程。 三、同步控制 1. synchronized...

    java 线程池与通过Future终止线程实例

    NULL 博文链接:https://waitingkkk-163-com.iteye.com/blog/2232286

    JAVA中 终止线程的方法介绍

    JAVA中终止线程的方法介绍 JAVA 中终止线程的方法是一种重要的多线程编程技术,在Java中,java.lang.Thread类型包含了一些列的方法start(), stop(), stop(Throwable) and suspend(), destroy()and resume()。通过...

    java中 如何终止一个线程

    在Java早期版本中,提供了`Thread.stop()`方法来直接终止线程,但这种方法存在严重的安全问题。例如,它可能会导致对象处于不稳定的状态,或者在对象的某些关键操作(如资源释放)完成之前就强行终止线程,从而引发...

    java 多线程示例

    线程有五种基本状态:新建、就绪、运行、阻塞和终止。了解这些状态有助于理解线程的生命周期。 3. **线程优先级** Java线程有10个优先级,从`MIN_PRIORITY`(1)到`MAX_PRIORITY`(10),默认是`NORM_PRIORITY`(5)。...

    Java多线程编程实战指南-核心篇

    Java通过Thread类来表示线程,每个线程都有自己的程序计数器、虚拟机栈、本地方法栈和堆。线程的创建可以通过继承Thread类或实现Runnable接口,然后通过start()方法启动。线程的生命周期包括新建、就绪、运行、阻塞...

    Java多线程编程经验

    2. **实现 `java.lang.Runnable` 接口**:通过实现 `run()` 方法定义线程的行为,并使用 `Thread` 类的构造函数创建线程。 #### 三、Java线程:创建与启动 ##### 定义线程 1. **扩展 `java.lang.Thread` 类**:...

    Java 多线程介绍

    5. **Dead(死亡)**:当线程完成其`run()`方法的执行或由于某种异常终止时,它将进入Dead状态。此时,线程无法再次启动。 #### Thread类与线程控制方法 在Java中,线程通过`Thread`类来表示和管理。`Thread`类...

    Java多线程练习题

    Java中的线程有五种状态:新建(New)、就绪(Runnable)、运行(Running)、等待/阻塞(Blocked)、终止(Terminated)。了解这些状态以及它们之间的转换对于理解多线程的执行流程非常重要。 三、线程同步 1. ...

    java多线程课件

    在Java中,每个程序都有一个主线程,通常由main()方法启动,其他的线程则需要通过调用start()方法来启动。 Java提供了两种主要的创建线程的方式: 1. **创建Thread子类**:首先创建Thread类的子类,并重写run()...

    JAVA线程停止的方法

    在Java中,直接调用线程的`stop()`方法来终止线程已被废弃,因为这可能导致资源泄露、数据不一致等问题。取而代之的是,开发者通常采用以下几种策略: 1. **使用标志变量(Flag)** 2. **中断线程(Interrupt)** 3...

    java多线程示例

    守护线程在所有非守护线程结束时自动终止,通常用于后台服务,如垃圾收集器。 通过以上知识点,我们可以更好地理解和运用Java多线程,实现高效、稳定的并发程序。文档“java多线程实例.docx”可能包含具体的示例...

    java多线程.pdf

    当Java程序启动时,JVM会创建主线程并在该线程中调用`main()`方法。除了主线程外,JVM还会创建其他线程用于垃圾回收、对象销毁等内部管理任务。 ##### 2. 线程的特点 - **共享资源**:线程之间共享同一个进程的...

    Java多线程端口快速扫描

    - 在多线程环境中,每个线程都应该有适当的异常处理机制,防止线程因未捕获的异常而突然终止,导致整个程序崩溃。 6. **性能优化** - 并发数量的调整:线程过多可能会增加系统开销,而过少则可能无法充分利用多核...

    java 多线程编程实战指南(核心 + 设计模式 完整版)

    - **线程间通信**:`wait()`, `notify()` 和 `notifyAll()` 方法用于线程间的协作,需要在同步块或方法中使用。 3. **线程池** - **Executor框架**:`ExecutorService`、`ThreadPoolExecutor`和`Executors`工厂类...

    java一个多线程的经典例子

    现在推荐的做法是在`run()`方法内通过设置一个标志位来控制线程的运行状态,从而达到优雅地终止线程的目的。 ```java if (thread1.isAlive()) { thread1.stop(); // 终止thread1 System.out.println("thread1已经...

    Java多线程编程总结

    - Java线程的状态包括新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)、等待(Waiting)、时间等待(Timed Waiting)和终止(Terminated)。 - 线程可以通过调用特定的方法改变其状态,例如 `start()`、`sleep()...

Global site tag (gtag.js) - Google Analytics