当前位置: 首页 > 面试题库 >

如何停止无需任何使用就永远运行的线程

华萧迟
2023-03-14
问题内容

在下面的代码中,我有一个while(true)循环。考虑到try块中有一些代码,该线程应该执行大约需要一分钟的某些任务的情况,但是由于某些预期的问题,该线程将永远运行。我们可以停止该线程吗?

public class thread1 implements Runnable {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        thread1 t1 = new thread1();
        t1.run();

    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        while(true){
            try{        
                Thread.sleep(10);

            }
            catch(Exception e){
                e.printStackTrace();
            }
        }
    }
}

问题答案:

首先,您不在这里启动任何线程!您应该创建一个新线程并将混乱的名称传递thread1 Runnable给它:

thread1 t1 = new thread1();
final Thread thread = new Thread(t1);
thread.start();

现在,当您真正拥有线程时,有一个内置功能可以中断正在运行的线程,称为… interrupt()

thread.interrupt();

但是,仅设置此标志无效,您必须在运行的线程中进行处理:

while(!Thread.currentThread().isInterrupted()){
    try{        
        Thread.sleep(10);
    }
    catch(InterruptedException e){
        Thread.currentThread().interrupt();
        break; //optional, since the while loop conditional should detect the interrupted state
    }
    catch(Exception e){
        e.printStackTrace();
    }

需要注意的两件事:while循环现在在thread时结束isInterrupted()。但是,如果线程在睡眠期间被中断,那么JVM会非常友好,它会抛出InterruptedExceptionout来通知您sleep()。抓住它,打破循环。而已!

至于其他建议:

  • 关于Thread.stop():

不推荐使用 。这种方法本质上是不安全的[…]

  • 添加您自己的标志并留意它是可以的(请记住要使用AtomicBooleanvolatile!),但是如果JDK已经为您提供了这样的内置标志,为什么还要麻烦呢?额外的好处是可以中断sleeps,使线程中断的响应速度更快。


 类似资料:
  • 在其他语言中,此任务很简单,只需在Python中使用类似以下内容: 如果没有什么要处理的,我的程序也会想暂停执行。我不希望它用查询使数据库过载。 我正在尝试编写一个应用程序,它将充当后台队列处理器。它将检查数据库,看看队列中是否有任何需要处理的项目,然后该程序将数据写入磁盘上的文件。连接到同一数据库的不同系统的用户会间歇性地将数据添加到数据库中。 我认为永久npm模块不太合适,因为该模块只是检查脚

  • 问题内容: 我在另一台计算机上运行ffmpeg进行屏幕捕获。我希望能够停止它的远程录制。FFMPEG要求按q停止编码,因为它必须进行一些最终确定才能完全整理文件。我知道我可以使用kill / killall杀死它,但这可能会导致视频损坏。 我在Google上找不到专门用于此目的的任何东西,但是有人建议将回显到/ proc // fd / 0起作用。 我已经尝试过了,但是它并没有停止ffmpeg。但

  • 不知道如何阻止这个while循环无限重复。我使用检查用户输入是否为int。如果没有输入int值,则循环将无限重复。

  • 我通过创建固定数量的线程来使用执行器服务来进行HTTP GET数据检索。 当Tomcat停止时,我们会出现以下错误: 严重:web应用程序[/viewer]似乎已启动名为[ThreadExecutor_51616156]的线程,但未能停止该线程。这很可能会造成内存泄漏。 这是真的吗?在没有这些服务错误的情况下,如何正确停止tomcat。

  • 问题内容: 如您所见,我是新来的… 我建立了第一个网站,建立了第一个Node.js服务器来为其提供服务,然后将所有内容实时发布到EC2上。 我在我的EC2 IP地址上测试了所有内容,并且似乎一切正常。 现在直到现在,我一直在本地测试我的应用程序,因此每当我关闭终端时,app.js都将停止运行,因此在localhost上将不会提供任何服务,这是有道理的。 现在,我的服务器位于EC2上,每当我关闭终端