《Java多线程编程核心技术(第2版)》 —1.11.3 能停止的线程—异常法
1.11.3 能停止的线程—异常法
根据前面所学知识,只需要通过线程的for语句来判断一下线程是否处于停止状态即可判断后面的代码是否可运行,如果线程处于停止状态,则后面的代码不再运行。
创建实验用的项目t13,类MyThread.java代码如下:
public class MyThread extends Thread {
@Override
public void run() {
super.run();
for (int i = 0; i < 500000; i++) {
if (this.interrupted()) {
System.out.println("已经是停止状态了!我要退出了!");
break;
}
System.out.println("i=" + (i + 1));
}
}
}
类Run.java代码如下:
public class Run {
public static void main(String[] args) {
try {
MyThread thread = new MyThread();
thread.start();
Thread.sleep(2000);
thread.interrupt();
} catch (InterruptedException e) {
System.out.println("main catch");
e.printStackTrace();
}
System.out.println("end!");
}
}
程序运行结果如图1-44所示。
图1-44 线程可以退出了
上面示例虽然停止了线程,但如果for语句下面还有语句,那么程序还是会继续运行。创建测试项目t13forprint,类MyThread.java代码如下:
package exthread;
public class MyThread extends Thread {
@Override
public void run() {
super.run();
for (int i = 0; i < 500000; i++) {
if (this.interrupted()) {
System.out.println("已经是停止状态了!我要退出了!");
break;
}
System.out.println("i=" + (i + 1));
}
System.out.println("我被输出,如果此代码是for又继续运行,线程并未停止!");
}
}
文件Run.java代码如下:
package test;
import exthread.MyThread;
import exthread.MyThread;
public class Run {
public static void main(String[] args) {
try {
MyThread thread = new MyThread();
thread.start();
Thread.sleep(2000);
thread.interrupt();
} catch (InterruptedException e) {
System.out.println("main catch");
e.printStackTrace();
}
System.out.println("end!");
}
}
程序运行结果如图1-45所示。
图1-45 for后面的语句继续运行
如何解决语句继续运行的问题呢?看一下更新后的代码。
创建t13_1项目,类MyThread.java代码如下:
package exthread;
public class MyThread extends Thread {
@Override
public void run() {
super.run();
try {
for (int i = 0; i < 500000; i++) {
if (this.interrupted()) {
System.out.println("已经是停止状态了!我要退出了!");
throw new InterruptedException();
}
System.out.println("i=" + (i + 1));
}
System.out.println("我在for下面");
} catch (InterruptedException e) {
System.out.println("进MyThread.java类run方法中的catch了!");
e.printStackTrace();
}
}
}
类Run.java代码如下:
package test;
import exthread.MyThread;
public class Run {
public static void main(String[] args) {
try {
MyThread thread = new MyThread();
thread.start();
Thread.sleep(2000);
thread.interrupt();
} catch (InterruptedException e) {
System.out.println("main catch");
e.printStackTrace();
}
System.out.println("end!");
}
}
程序运行结果如图1-46所示。
由程序运行结果可以看出,线程终于被正确停止了。这种方式就是1.11节介绍的第三种停止线程的方法—使用interrupt()方法中断线程。
图1-46 线程正确停止
- 点赞
- 收藏
- 关注作者
评论(0)