使用共享变量的方式 在这种方式中,之所以引入共享变量,是因为该变量可以被多个执行相同任务的线程用来作为是否中断的信号,通知中断线程的执行。
使用interrupt方法终止线程 如果一个线程由于等待某些事件的发生而被阻塞,又该怎样停止该线程呢?这种情况经常会发生,比如当一个线程由于需要等候键盘输入而被阻塞,或者调用Thread.join()方法,或者Thread.sleep()方法,在网络中调用ServerSocket.accept()方法,或者调用了DatagramSocket.receive()方法时,都有可能导致线程阻塞,使线程处于处于不可运行状态时,即使主程序中将该线程的共享变量设置为true,但该线程此时根本无法检查循环标志,当然也就无法立即中断。这里我们给出的建议是,不要使用stop()方法,而是使用Thread提供的interrupt()方法,因为该方法虽然不会中断一个正在运行的线程,但是它可以使一个被阻塞的线程抛出一个中断异常,从而使线程提前结束阻塞状态,退出堵塞代码。
下面实例采用第二种方案处理:
Thread.java类中提供了两种方法:
Thread.interrupted(): 测试当前线程是否已经中断,测试当前线程是否已经中断。线程的中断状态由该方法清除。换句话说,如果连续两次调用该方法,则第二次调用返回false;
this.isInterrupted(): 测试线程是否已经中断,isInterrupted()并不会清除状态,如果连续两次调用该方法会打印了两个true;
Main线程代码:
@Slf4j
public class MainThread {public static void main(String[] args){Thread thread = new MyThread();thread.start();try {Thread.sleep(2000);thread.interrupt();} catch (InterruptedException e) {log.error("中断异常:{}",e.getMessage());}}
}
MyThread代码:
@Slf4j
public class MyThread extends Thread {public void run(){try {log.info("线程开始。。。");Thread.sleep(200000);log.info("线程结束。");} catch (InterruptedException e) {log.info("在沉睡中被停止, 进入catch, 调用isInterrupted()方法的结果是:" + this.isInterrupted());}}
}
运行结果:
线程并没有变成中断状态,但是Mythread已经从阻塞状态终止;