Java多线程目录
前提
刚接触线程时一直想怎么立刻停止线程,现在了解了,对于现在电脑来说,立刻终止线程会造成各种各样的问题,所以在Java中,线程的终止就是为了让线程自动执行完,下面终止线程的方法最终目的都是这样。
中断
中断是当前线程的一个标志位,在线程内外的表现就是true/false,
中断的三个方法
public void interrupt(); //设置中断
public boolean isInterrupted(); //只判断标记位
public static boolean interrupted(); //静态方法,判断标记为并清除标记位
这里在实例中说明这三个方法
public class ThreadOne extends Thread{
@Override
public void run() {
super.run();
while (!Thread.currentThread().isInterrupted()) {
System.out.println("1::" + Thread.currentThread().isInterrupted());
}
System.out.println("线程结束1:" + Thread.currentThread().isInterrupted());
System.out.println("线程结束2:" + Thread.interrupted());
System.out.println("线程结束3:" + Thread.interrupted());
}
public static void main(String[] args) {
ThreadOne one = new ThreadOne();
one.start();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
one.interrupt();
}
}
输出:
1::false
1::false
1::false
1::false
线程结束1:true
线程结束2:true
线程结束3:false
这样就可以安全的利用中断来停止我们的线程。
注意:中断并不会立即停止我们的线程,它只会设置标志位,来让线程主动检测,后我们自己设置线程停止返回逻辑。
自己设置标记位
和中断思路一样,我们自己设置标记为是一样的效果。
public class ThreadOne extends Thread {
private volatile boolean end = false;
@Override
public void run() {
super.run();
while (!end) {
System.out.println("1::" + end);
}
System.out.println("线程结束1:" + end);
}
public void cancle(){
this.end = true;
}
public static void main(String[] args) {
ThreadOne one = new ThreadOne();
one.start();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
one.cancle();
}
}