线程的中断

如果一个Java程序有不止一个执行线程,当所有线程都运行结束的时候,这个Java程序才能运行结束;更确切地说应该是所有的非守护线程运行结束时,或者其中一个线程调用了System.exit()方法时,这个Java程序才运行结束。

Java提供了中断机制,我们可以使用它来结束一个线程。这种机制要求线程检查它是否被中断了,然后决定是不是响应这个中断请求。线程允许忽略中断请求并且继续执行。

package concurrency;

public class Generator2 extends Thread {
    public static void main(String[] args) {
        Thread task = new Generator2();
        task.start();
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //中断线程
        task.interrupt();
    }
    @Override
    public void run() {
        long number = 1L;
        while(true){
            if(isPrime(number)){
                System.out.printf("Number %d is Prime\n", number);
            }
            //判断是否被中断
            if(isInterrupted()){
                System.out.printf("The Prime Generator2 has been Interrupted");
                return;
            }
            number++;
        }
    }
    //如果接收到的参数是一个质数就返回true
    private boolean isPrime(long number){
        if(number <= 2){
            return true;
        }
        for(long i = 2; i < number; i++){
            if(number % i == 0){
                return false;
            }
        }
        return true;
    }
}

Thread类有一个表明线程被中断与否的属性,它存放的是布尔值。线程的interrupt()方法被调用时,这个属性就会被设置为true。isInterrupted()方法只是返回这个属性的值。

还有一个方法可以检查线程是否被中断,即Thread类的静态方法interrupted()用来检查当前执行的线程是否被中断。isInterrupted()和interrupted()方法有一个很大的区别。isInterrupted()不能改变interrupted属性的值,但是后者能设置interrupted属性为false。因为interrupted()是一个静态方法,更推荐使用isInterrupted()方法。

时间: 2024-11-03 21:33:13

线程的中断的相关文章

Java线程阻塞中断和LockSupport的常见问题

上周五和周末,工作忙里偷闲,在看java cocurrent中也顺便再温故了一下Thread.interrupt和java 5之后的LockSupport的实现. 在介绍之前,先抛几个问题. Thread.interrupt()方法和InterruptedException异常的关系?是由interrupt触发产生了InterruptedException异常? Thread.interrupt()会中断线程什么状态的工作? RUNNING or BLOCKING? 一般Thread编程需要关注

JAVA学习笔记(四十)- 守护线程与中断线程

守护线程 /* * Daemon线程,即守护线程 * 一般都在后台运行,为其他线程提供服务,不能单独存在 */ public class Test08 { public static void main(String[] args) { MyThread8 t1 = new MyThread8("守护线程"); System.out.println("是守护线程吗?"+t1.isDaemon()); t1.setDaemon(true); System.out.pr

java线程的中断学习

<span style="font-size:18px;">package thread.java.test; /** * 在这里练习的是线程的中断 * Thread.interrupt()来设置中断状态是true,当一个线程运行时,另一个线程可以调用另一个 * 线程的interrupt()方法来中断他 * Thread.isInterrupt()来获取线程的中断状态 * Thread.interrupted()这是一个静态的方法,用来获取中断状态,并清除中断状态, * 其

线程的终止stop与线程的中断interrupted

线程除了运行完毕,自动进入死亡状态,也可以手动进行停止,Thread类也提供了2个类方法来进行线程的停止. 一.stop 如图所示,stop方法已经被标记为过时的,不推荐的.因为这这个方法太过于暴力,会立即杀死进程,导致数据不能同步,带来很难排查的错误. 下面是一段造成错误信息的代码: 1 public class StopThreadUnsafe { 2 public static User u = new User(); 3 4 public static class User { 5 pr

Java并发学习之三——线程的中断

本文是学习网络上的文章时的总结,感谢大家无私的分享. 1.一个多个线程在执行的Java程序,只有当其全部的线程执行结束时(更具体的说,是所有非守护线程结束或者某个线程调用System.exit()方法的时候),它才会结束运行.有时,你需要为了终止程序而结束一个线程,或者当程序的用户想要取消某个Thread对象正在做的任务. 2.Java提供中断机制来通知线程表明我们想要结束它.中断机制的特性是线程需要检查是否被中断,而且还可以决定是否相应结束的请求.所以,线程可以忽略中断请求并且继续运行. 3.

Java并发编程 - 逐级深入 看线程的中断

最近有足够的空闲时间 去东看看西看看,突然留意到在Java的并发编程中,有关线程中断的,以前初学时一直没弄清楚的一些小东西. 于是,刚好把收获简单的总结一下,通过此文来总结记录下来. 从源码看线程的状态 在开始分析线程的中断工作之前,我们肯定要先留意一个点,那就是肯定是有开启,才会有与之对应的中断工作出现. 开启一个线程的工作,相信每个Javaer都烂熟于心.它很简单,new一个thread对象,然后调用start方法开启线程. 那么,一个好玩的问题就出现了:既然开启一个线程的步骤如此简单明了,

Java多线程(2)--线程的中断和中断的控制

如果Java程序不只有一个执行线程,只有当所有线程结束的时候这个程序才能运行结束.更确切的说是所有的非守护线程运行结束的时候,或者其中一个线程调用了System.exet()方法时,程序才运行结束. Java提供了中断机制,我们可以采用它来结束一个线程.我们创建一个线程,使其运行5秒后通过中断机制强制使其终止.程序检查数字是否是质数. package com.concurrency; public class PrimeGenerator extends Thread{ //继承自Thread类

Java线程的中断(Interruption)

任务和线程的启动很容易.在大多数时候,我们都会让它们运行直到结束,或者让它们自行停止.然而,有时候我们希望提前结束任务或线程,或许是因为用户取消了操作,或者应用程序需要被快速关闭. 要使任务和线程能安仝.快速.可靠地停止下来,并不是一件容易的事.Java的Thread类为我们提供了stop(),suspend()等停止挂起线程的方法,但是由于安全问题目前都已被弃用.Java并没有提供一种安全的抢占式方法来停止线程,但它提供了中断(Interruption),这是一种协作机制,采用协作式的方式使一

java线程阻塞中断与LockSupport使用介绍

上周五和周末,工作忙里偷闲,在看java cocurrent中也顺便再温故了一下Thread.interrupt和java 5之后的LockSupport的实现. 在介绍之前,先抛几个问题. Thread.interrupt()方法和InterruptedException异常的关系?是由interrupt触发产生了InterruptedException异常? Thread.interrupt()会中断线程什么状态的工作? RUNNING or BLOCKING? 一般Thread编程需要关注