菜鸟面试官:如何停止一个正在运行的线程?我蒙了~
阅读本文大概需要 8 分钟。
来自:cnblogs.com/greta/p/5624839.html
使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。 使用stop方法强行终止,但是不推荐这个方法,因为stop和suspend及resume一样都是过期作废的方法。 使用interrupt方法中断线程。
# 停止不了的线程
public class MyThread extends Thread {public void run(){super.run();for(int i=0; i<500000; i++){System.out.println("i="+(i+1));}}}public class Run {public static void main(String args[]){Thread thread = new MyThread();thread.start();try {Thread.sleep(2000);thread.interrupt();} catch (InterruptedException e) {e.printStackTrace();}}}
...i=499994i=499995i=499996i=499997i=499998i=499999i=500000
# 判断线程是否停止状态
this.interrupted(): 测试当前线程是否已经中断; this.isInterrupted(): 测试线程是否已经中断;
public class MyThread extends Thread {public void run(){super.run();for(int i=0; i<500000; i++){i++;// System.out.println("i="+(i+1));}}}public class Run {public static void main(String args[]){Thread thread = new MyThread();thread.start();try {Thread.sleep(2000);thread.interrupt();System.out.println("stop 1??" + thread.interrupted());System.out.println("stop 2??" + thread.interrupted());} catch (InterruptedException e) {e.printStackTrace();}}}
stop 1??falsestop 2??false
System.out.println("stop 1??" + thread.interrupted());System.out.println("stop 2??" + thread.interrupted());
public class Run2 {public static void main(String args[]){Thread.currentThread().interrupt();System.out.println("stop 1??" + Thread.interrupted());System.out.println("stop 2??" + Thread.interrupted());System.out.println("End");}}
stop 1??truestop 2??falseEnd
public class Run3 {public static void main(String args[]){Thread thread = new MyThread();thread.start();thread.interrupt();System.out.println("stop 1??" + thread.isInterrupted());System.out.println("stop 2??" + thread.isInterrupted());}}
stop 1??truestop 2??true
# 能停止的线程--异常法
public class MyThread extends Thread {public void run(){super.run();for(int i=0; i<500000; i++){if(this.interrupted()) {System.out.println("线程已经终止, for循环不再执行");break;}System.out.println("i="+(i+1));}}}public class Run {public static void main(String args[]){Thread thread = new MyThread();thread.start();try {Thread.sleep(2000);thread.interrupt();} catch (InterruptedException e) {e.printStackTrace();}}}
...i=202053i=202054i=202055i=202056线程已经终止, for循环不再执行
public class MyThread extends Thread {public void run(){super.run();for(int i=0; i<500000; i++){if(this.interrupted()) {System.out.println("线程已经终止, for循环不再执行");break;}System.out.println("i="+(i+1));}System.out.println("这是for循环外面的语句,也会被执行");}}
...i=180136i=180137i=180138i=180139线程已经终止, for循环不再执行这是for循环外面的语句,也会被执行
public class MyThread extends Thread {public void run(){super.run();try {for(int i=0; i<500000; i++){if(this.interrupted()) {System.out.println("线程已经终止, for循环不再执行");throw new InterruptedException();}System.out.println("i="+(i+1));}System.out.println("这是for循环外面的语句,也会被执行");} catch (InterruptedException e) {System.out.println("进入MyThread.java类中的catch了。。。");e.printStackTrace();}}}
...i=203798i=203799i=203800线程已经终止, for循环不再执行进入MyThread.java类中的catch了。。。java.lang.InterruptedExceptionat thread.MyThread.run(MyThread.java:13)
# 在沉睡中停止
public class MyThread extends Thread {public void run(){super.run();try {System.out.println("线程开始。。。");Thread.sleep(200000);System.out.println("线程结束。");} catch (InterruptedException e) {System.out.println("在沉睡中被停止, 进入catch, 调用isInterrupted()方法的结果是:" + this.isInterrupted());e.printStackTrace();}}}
线程开始。。。在沉睡中被停止, 进入catch, 调用isInterrupted()方法的结果是:falsejava.lang.InterruptedException: sleep interruptedat java.lang.Thread.sleep(Native Method)at thread.MyThread.run(MyThread.java:12)
public class MyThread extends Thread {public void run(){super.run();try {System.out.println("线程开始。。。");for(int i=0; i<10000; i++){System.out.println("i=" + i);}Thread.sleep(200000);System.out.println("线程结束。");} catch (InterruptedException e) {System.out.println("先停止,再遇到sleep,进入catch异常");e.printStackTrace();}}}public class Run {public static void main(String args[]){Thread thread = new MyThread();thread.start();thread.interrupt();}}
i=9998i=9999先停止,再遇到sleep,进入catch异常java.lang.InterruptedException: sleep interruptedat java.lang.Thread.sleep(Native Method)at thread.MyThread.run(MyThread.java:15)
# 能停止的线程---暴力停止
public class MyThread extends Thread {private int i = 0;public void run(){super.run();try {while (true){System.out.println("i=" + i);i++;Thread.sleep(200);}} catch (InterruptedException e) {e.printStackTrace();}}}public class Run {public static void main(String args[]) throws InterruptedException {Thread thread = new MyThread();thread.start();Thread.sleep(2000);thread.stop();}}
i=0i=1i=2i=3i=4i=5i=6i=7i=8i=9Process finished with exit code 0
# 方法stop()与java.lang.ThreadDeath异常
public class MyThread extends Thread {private int i = 0;public void run(){super.run();try {this.stop();} catch (ThreadDeath e) {System.out.println("进入异常catch");e.printStackTrace();}}}public class Run {public static void main(String args[]) throws InterruptedException {Thread thread = new MyThread();thread.start();}}
# 释放锁的不良后果
public class SynchronizedObject {private String name = "a";private String password = "aa";public synchronized void printString(String name, String password){try {this.name = name;Thread.sleep(100000);this.password = password;} catch (InterruptedException e) {e.printStackTrace();}}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}}public class MyThread extends Thread {private SynchronizedObject synchronizedObject;public MyThread(SynchronizedObject synchronizedObject){this.synchronizedObject = synchronizedObject;}public void run(){synchronizedObject.printString("b", "bb");}}public class Run {public static void main(String args[]) throws InterruptedException {SynchronizedObject synchronizedObject = new SynchronizedObject();Thread thread = new MyThread(synchronizedObject);thread.start();Thread.sleep(500);thread.stop();System.out.println(synchronizedObject.getName() + " " + synchronizedObject.getPassword());}}
b aa
# 使用return停止线程
public class MyThread extends Thread {public void run(){while (true){if(this.isInterrupted()){System.out.println("线程被停止了!");return;}System.out.println("Time: " + System.currentTimeMillis());}}}public class Run {public static void main(String args[]) throws InterruptedException {Thread thread = new MyThread();thread.start();Thread.sleep(2000);thread.interrupt();}}
...Time: 1467072288503Time: 1467072288503Time: 1467072288503线程被停止了!
最近面试BAT,整理一份面试资料《Java面试BATJ通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
朕已阅 
评论

