当前位置: 首页 > 知识库问答 >
问题:

在Java中,在另一个线程的run方法中中断一个线程

盖雪峰
2023-03-14

我正在阅读这篇文章,关于从一个线程中断另一个线程的建议是

“”“如果正确实施,以下几种方法应该可以奏效。

您可以让两个线程定期检查一些常见的标志变量(例如,将其称为stopNow),并安排两个线程在完成时进行设置。(标志变量需要是volatile…或正确同步的。)

您可以让两个线程定期调用线程。isInterrupted()方法,查看它是否已被中断。然后每个线程都需要调用线程。完成后,在另一个上中断()。" " "

我不明白第二种方法是如何使用线程的。isInterrupted()。也就是说,如何调用线程1。线程2上的中断()。

考虑这个例子,在main方法中,我启动了两个线程t1和t2。我想在达到一定条件后停止t1。我怎样才能做到这一点?

    class Thread1 extends Thread {
        
        
        public void run(){
            while (!isDone){
                // do something 
            }
        }        //now interrupt Thread-2
    }
    
    class Thread2 extends Thread {
        
        public void run(){
            try {
                     while(!Thread.isInterupted()){
                     //do something;
               }
               catch (InterruptedExecption e){
                    //do something               
                }
       }
}
        
    
    public class test {
        
        public static void main(String[] args){
        
        
        try {

            Thread1 t1 = new Thread1();
            Thread2 t2 = new Thread2();
            t1.start();
            t2.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
        }
        
    
    }

共有3个答案

宦源
2023-03-14

您可以考虑使用未来的界面。它提供了一个取消方法。http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html

窦弘义
2023-03-14
public class test {

private static boolean someCondition = true;


public static void main(String[]args){

    Thread t2 = new Thread(new someOtherClass("Hello World"));
    Thread t1 = new Thread(new someClass(t2));
    t2.start();
    t1.start();
    try {
        t1.join();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

static class someClass implements Runnable{

    Thread stop;
    public someClass(Thread toStop){
        stop = toStop;
    }


    public void run(){
        while(true){
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            if(someCondition && !stop.isInterrupted()){

                stop.interrupt();

            } 
        }
    }
}

static class someOtherClass implements Runnable{
    String messageToPrint;

    public someOtherClass(String s){
        messageToPrint = s;
    }

    public void run(){

        while(true){
            try {

                Thread.sleep(500);


            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


            System.out.println(messageToPrint);
        }
    }
}

}

楮乐邦
2023-03-14

这里的上下文是您正在尝试使用线程中断来实现您的方案。

为了实现这一点,t1对象需要引用t2线程对象,然后它只调用t2。中断()。

t1可以通过多种方式获取对t2的引用。

  • 它可以作为构造函数参数传递。(您需要在Thread1之前实例化Thread2…)
  • 可以通过调用Thread1上的setter来设置它
  • 它可以从静态变量或数组中检索,也可以从某种单一的“注册表”对象中检索
  • 可以通过枚举ThreadGroup中的所有线程来查找与t2名称匹配的线程
 类似资料:
  • 问题内容: 我有一个扩展线程的类。该线程在运行时会花费大部分时间处于睡眠状态,它将执行检查,如果为true,则执行简单的操作,然后睡眠1/2秒并重复执行。 该类还具有由其他线程调用的公共方法。如果调用此方法,则我希望线程在已经处于休眠状态的情况下休眠更长的时间,或者在没有休眠的情况下立即休眠。我试图让this.sleep出现,但它似乎仍在休眠当前线程,并且它抱怨该方法sleep是静态的,应该被静态

  • 在一个android服务中,我创建了用于执行一些后台任务的线程。 我遇到一个情况,线程需要在主线程的消息队列上发布特定任务,例如。 有没有方法获取主线程的并从我的另一个线程向它发布/?

  • 本文向大家介绍Java中断一个线程操作示例,包括了Java中断一个线程操作示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java中断一个线程操作。分享给大家供大家参考,具体如下: 一 点睛 中断一个线程,意味着该线程在完成任务之前,停止它正在进行的一切当前的操作。 有三个比较常用的函数: interrupt():一个正在运行的A线程,可以调用B线程对应的interrupt方法来中断线

  • 目前,我使用的是firebase实时数据库。因此,我的数据更改来自另一个线程。因此,我无法控制何时更新新的数据。然后我如何知道何时调用以刷新UI? 谢谢

  • 我是android新手,我试图发出http post请求,我得到了以下错误,我已经发布了我的代码和我的Logcat的一些行。我应该在另一个类中这样做吗?如果是,如何做,或者只是我必须在当前代码中修复的东西。 logview 02-18 10:03:20.477:W/DalvikVM(3759):ThreadId=15:线程退出,异常未捕获(组=0x4001D760) 02-18 10:03:20.

  • 以下是问题陈述: 编写一个java程序,使用线程计算前25个素数,并计算前50个斐波那契数。将计算斐波那契数的线程的优先级设置为8,将另一个设置为5。在计算了30个斐波那契数之后,让这个线程进入睡眠状态,开始计算素数。计算完25个素数后,继续斐波那契数计算。 我的代码: 我本以为当斐波那契线停止时,其余的素数会被打印出来,但那没有发生,这背后的原因可能是什么?