如何手动停止一个线程

转载自:https://www.cnblogs.com/luckygxf/p/4737655.html

  在Java的多线程编程中,java.lang.Thread类型包含了一些列的方法start(), stop(), stop(Throwable) and suspend(), destroy() and resume()。通过这些方法,我们可以对线程进行方便的操作,但是这些方法中,只有start()方法得到了保留。

方式1. 设置一个成员变量作为共享变量,相当于标志,在run()方法中不断检查标志,判断是否退出线程(跳出函数):
(只能中断处于运行状态的进程)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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(3000); // 主线程延迟3秒
thread.exit = true; // 将中断标志值为true
thread.join(); // 在主线程中等待thread线程执行完毕
System.out.println("线程退出!");
}
}

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

方式2. 使用Thread.interrupt()方法终止线程
(只能中断处于阻塞状态的进程)

如果一个线程由于等待某些事件的发生而被阻塞,又该怎样停止该线程呢?

  这种情况经常会发生,比如当一个线程由于需要等候键盘输入而被阻塞,或者调用Thread.join()方法,或者Thread.sleep()方法,在网络中调用ServerSocket.accept()方法,或者调用了DatagramSocket.receive()方法时,都有可能导致线程阻塞,使线程处于处于不可运行状态时,即使主程序中将该线程的共享变量设置为true,但该线程此时根本无法检查循环标志,当然也就无法立即中断。

  这里我们给出的建议是,不要使用stop()方法,而是使用Thread提供的interrupt()方法,因为该方法虽然不会中断一个正在运行的线程,但是它可以使一个被阻塞的线程抛出一个中断异常,从而使线程提前结束阻塞状态,退出堵塞代码。

注意:interrupted与isInterrupted

在Thread类中有两个方法可以判断线程是否通过interrupt方法被终止:

  1. 静态的interrupted用来判断当前线程是否被中断;

  2. 非静态的isInterrupted可以用来判断其他线程是否被中断。

---------------- The End ----------------
0%