java线程相关

中断一个正在运行的线程

  1. 中断阻塞线程的方法
@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()方法的线程执行完在继续执行当前线程的代码。

你可能感兴趣的:(java线程相关)