举报投诉联系我们 手机版 热门标签 编程学
您的位置:编程学 > Java线程中断 Java 线程中断

Java线程中断 Java 线程中断

2023-03-23 06:18 Java教程

Java线程中断 Java 线程中断

Java线程中断

Java线程中断是一种比较常用的多线程技术,它可以在不影响其他线程的情况下,对某个特定的线程进行中断。Java中断机制可以让一个正在运行的线程停止,而不会影响其他正在运行的线程。

Java中断机制是通过Thread.interrupt()方法来实现的,该方法会将目标Thread对象的中断标志位设为true,并不会立即停止该Thread对象。只有当该Thread对象执行到一些可以检测到中断标志位时(如sleep、wait、join方法)才会真正停止。

public class InterruptTest {

    public static void main(String[] args) throws InterruptedException {

        Thread t1 = new Thread(new Runnable() {

            @Override
            public void run() {

                while (true) {

                    if (Thread.currentThread().isInterrupted()) {

                        System.out.println("Interrupted!");

                        break;

                    }

                    try {

                        Thread.sleep(2000);

                    } catch (InterruptedException e) {

                        System.out.println("Interrupted When Sleep");

                        Thread.currentThread().interrupt(); // 再次设定中断标志位 

                    } 

                    Thread.yield();  // 礼让 

                } 

            } 
        }); 
        t1.start(); 
        Thread.sleep(2000); 
        t1.interrupt(); // 设定中断标志位  
    }  
}  

Java 线程中断

Java线程教程 - Java线程中断


我们可以通过使用interrupt()方法中断一个活动的线程。

这个方法调用在线程只是一个指示。它是由线程如何响应中断。

例子

下面的代码显示了中断主线程并打印线程中断状态的代码。

public class Main {
  public static void main(String[] args) {
    System.out.println("#1:" + Thread.interrupted());

    // Now interrupt the main thread
    Thread.currentThread().interrupt();

    // Check if it has been interrupted
    System.out.println("#2:" + Thread.interrupted());

    // Check again if it has been interrupted
    System.out.println("#3:" + Thread.interrupted());
  }
}

上面的代码生成以下结果。

例2

下面的代码如何一个线程将中断另一个线程。

public class Main {
  public static void main(String[] args) {
    Thread t = new Thread(Main::run);
    t.start();
    try {
      Thread.currentThread().sleep(1000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    t.interrupt();
  }

  public static void run() {
    int counter = 0;
    while (!Thread.interrupted()) {
      counter++;
    }
    System.out.println("Counter:" + counter);
  }
}

上面的代码生成以下结果。


例3

Thread类有一个非静态的isInterrupted()方法,可以用来测试一个线程是否被中断。

public class Main {
  public static void main(String[] args) {
    System.out.println("#1:" + Thread.interrupted());

    Thread mainThread = Thread.currentThread();
    mainThread.interrupt();

    System.out.println("#2:" + mainThread.isInterrupted());

    System.out.println("#3:" + mainThread.isInterrupted());

    System.out.println("#4:" + Thread.interrupted());

    System.out.println("#5:" + mainThread.isInterrupted());
  }
}

上面的代码生成以下结果。

例4

你可以中断一个被阻塞的线程。

如果在这三种方法上阻塞的线程被中断,则抛出一个InterruptedException,并清除线程的中断状态。

以下代码启动一个休眠一秒的线程,并打印一条消息,直到它被中断。

public class Main {
  public static void main(String[] args) throws InterruptedException{
    Thread t = new Thread(Main::run);
    t.start();
    Thread.sleep(5000);
    t.interrupt();
  }

  public static void run() {
    int counter = 1;
    while (true) {
      try {
        Thread.sleep(1000);
        System.out.println("Counter:" + counter++);
      } catch (InterruptedException e) {
        System.out.println("I got  interrupted!");
      }
    }
  }
}

上面的代码生成以下结果。

阅读全文
以上是编程学为你收集整理的Java线程中断 Java 线程中断全部内容。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
相关文章
© 2024 编程学 bianchengxue.com 版权所有 联系我们
桂ICP备19012293号-7 返回底部