【并发编程】怎么样让 Java 里的线程安全停止工作 (interrupt())

本贴最后更新于 2100 天前,其中的信息可能已经时过境迁

怎么样让 Java 里的线程安全停止工作

作者:Moonce
博客:望舒阁

方法

  • 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(); 
  }
}
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3186 引用 • 8212 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...