中断一个正在运行的线程
- 中断阻塞线程的方法
@Override
public void run() {
try {
while (true) {
// 执行任务...
}
} catch (InterruptedException ie) {
// 由于产生InterruptedException异常,退出while(true)循环,线程终止!
}
}
我们调用线程对象的interrupt()方法时会产生InterruptedException中断。中断的捕获在while(true)之外,这样就退出了while(true)循环!
2.终止处于运行状态的线程
@Override
public void run() {
while (!isInterrupted()) {
// 执行任务...
}
}
isInterrupted()是判断线程的中断标记是不是为true。当线程处于运行状态,并且我们需要终止它时;可以调用线程的interrupt()方法,使用线程的中断标记为true,即isInterrupted()会返回true。此时,就会退出while循环。
3.通过标志位中断线程
private volatile boolean flag= true;
protected void stopTask() {
flag = false;
}
@Override
public void run() {
while (flag) {
// 执行任务...
}
}
通过volatile变量保证内存的可见性,从而保证多线程设置标志位终止线程
线程的join()方法
public class JoinTest implements Runnable{
public static int a = 0;
public void run() {
for (int k = 0; k < 5; k++) {
a = a + 1;
}
}
public static void main(String[] args) throws Exception {
Runnable r = new JoinTest();
Thread t = new Thread(r);
t.start();
System.out.println(a);
}
}
正常情况下,打印出来a的值不确定,因为主线程启动t之后继续往下走,执行打印语句,此时子线程执行到哪一步还不确定,所以a的值不能确定,如果我想在执行完子线程之后再打印怎么实现呢,如下:
public static void main(String[] args) throws Exception {
Runnable r = new JoinTest();
Thread t = new Thread(r);
t.start();
t.join(); //加入join()
System.out.println(a);
}
改为如下代码即可实现子线程执行完在执行打印语句,join()方法其实就是当前线程等待调用join()方法的线程执行完在继续执行当前线程的代码。