怎么样让 Java 里的线程安全停止工作
方法
- sleep()
- suspend()和 resume()
- yield()
- stop()
- interrupt() - 推荐使用
实现
suspend()和 resume() 但是这两个方法因为有缺点(操作不当独占\不同步)而已经被弃用;
yield()方法的作用是放弃当前的 CPU 资源,将它让给其他任务去占用 CPU 执行时间。但放弃的时间不确定,有可能刚刚放弃,马上又获得 CPU 时间片。
虽然 stop()可以停止一个线程,但是这个方法是不安全的,已经被弃用。
interrupt()实现
调用一个线程的 interrupt() 方法中断一个线程,并不是强行关闭这个线程,只是跟这个线程打个招呼,将线程的中断标志位置为 true,线程是否中断,由线程本身决定。
isInterrupted() 判定当前线程是否处于中断状态。
static 方法 interrupted() 判定当前线程是否处于中断状态,同时中断标志位改为 false。
方法里如果抛出 InterruptedException,线程的中断标志位会被复位成 false,如果确实是需要中断线程,要求我们自己在 catch 语句块里再次调用 interrupt()。
package com.moonce.thread;
import java.util.concurrent.ExecutionException;
/**
* @author moonce
*
* 类说明:守护线程的使用和守护线程中的finally语句块
*/
public class InterruptThread {
private static class UseThread extends Thread {
@Override
public void run() {
try {
while (!isInterrupted()) {
System.out.println(Thread.currentThread().getName()
+ " I am extends Thread.");
}
System.out.println(Thread.currentThread().getName()
+ " interrupt flag is " + isInterrupted());
} finally {
System.out.println(Thread.currentThread().getName()
+ " finally");
}
}
}
public static void main(String[] args) throws InterruptedException,
ExecutionException {
UseThread useThread = new UseThread();
// useThread.setDaemon(true); //随主线程一起结束
useThread.start();
Thread.sleep(5);
useThread.interrupt();//协商终端
}
}
sleep()实现
在 Java 多线程中,可以使用 sleep()方法在指定毫秒数内让当前正在执行的线程休眠。
下面这段代码,使得主函数的 main 线程休眠了 1000ms。
public static void main(String[] args) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于