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

向Java中的另一个线程发送关闭信号

呼延原
2023-03-14

我有一个应用程序,它在一个单独的线程中的while循环中重复运行一些东西,直到用户触发关闭信号。我可以通过在工作线程中设置(易失性)布尔字段,将信号从主线程发送到工作线程,但是否有其他关闭/中断线程的方法,例如通过“java”中的任何实用程序。util。并发'?

我尝试调用ExecutorService的shutdown()或shutdownNow()方法,但它们无法停止工作线程。同时调用shutdown()并使用!线currentThread()。此处推荐的while条件中的isInterrupted()无法中断循环。我能找到的唯一其他方法是使用Countdownlock,但在这里我必须使用Countdownlock。getCount()!=0,但该方法的javadoc文档表示

此方法通常用于调试和测试目的。

在我看来,这是一种值得怀疑的方法。下面是我的示例代码

class Worker implements Runnable {
    //private volatile boolean shutdown = false; --> alternative to countdownlatch 
    @Override
    public void run() {

        while (countDownLatch.getCount() != 0) {
            //do some work    
        }
    }
}

public class App {
    public static void main(String[] args) {

    System.out.println("Press enter to stop");

    CountDownLatch countDownLatch = new CountDownLatch(1);

    ExecutorService es = Executors.newFixedThreadPool(1);
    es.execute(new Worker(countDownLatch));

    Scanner scanner = new Scanner(System.in);
    scanner.nextLine();

    System.out.println("Shut down signal received");

    countDownLatch.countDown();  //an alternative would be to set a boolean variable in worker

    es.shutdownNow();

}
}

还有其他干净的方法吗?

共有3个答案

濮献
2023-03-14

您可以获得[ExecutorService][http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html]来自[遗嘱执行人][http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executors.html]

通过对主线程中ExecutorsService的引用,您可以在收到信号时关闭线程池。

葛学民
2023-03-14

你们必须检查线程。在循环中中断(),以便在系统出现任何问题时将其关闭。退出()。然后你可以使用线程。interrupt(),这是ExecutorService。shutdown()仍使用。如果它不起作用,请向我们展示如何检查isInterrupted()的代码,以便我们可以修复它。线stop()存在,但有充分理由不推荐使用,因此不应使用。

汤玉宸
2023-03-14

还有其他干净的方法吗?不。坚持使用(volatile)布尔值。

我敢肯定。stop()可以工作,但没有机会正确清理。使用interrupted()/isInterrupted()可以工作,但它比布尔值要复杂一些。此外,有时你不想因为一个循环被中断就退出它。我在一些地方有代码,我从中断异常(InterruptedException)(或类似的东西)中恢复,然后检查布尔值(或任何东西),并根据其值,继续或不继续。

布尔运算与其他运算效果很好。我已经提到了中断。有朝一日,你可能会有20个不同的理由在10个(或更多)地方中的任何一个停止循环。这个布尔值正好适合;您可以轻松地编写代码,使您的线程在布尔值为true时始终停止,或在布尔值为false时从不停止,或执行任何其他需要执行的操作。

 类似资料:
  • 问题内容: 我想同时显示两个(或更多) JFrame 。 当我关闭其中一个(使用默认的关闭按钮)时,其他框架仍应可见。 我怎样才能做到这一点? 问题答案: 如果您 不 希望应用程序在a 关闭时终止,请使用 代替 从文档中: (在WindowConstants中定义):不执行任何操作;要求程序处理注册的WindowListener对象的windowClosing方法中的操作。 (在WindowCon

  • 我正在阅读这篇文章,关于从一个线程中断另一个线程的建议是 “”“如果正确实施,以下几种方法应该可以奏效。 您可以让两个线程定期检查一些常见的标志变量(例如,将其称为stopNow),并安排两个线程在完成时进行设置。(标志变量需要是volatile…或正确同步的。) 您可以让两个线程定期调用线程。isInterrupted()方法,查看它是否已被中断。然后每个线程都需要调用线程。完成后,在另一个上中

  • 我创建了基于JAVA SWT的GUI,它可以与外部C可执行文件进行交互。我的GUI使用ProcessBuilder调用这个c进程。在C进程可执行文件中,我重载了信号函数(CTRL C,CTRL D)。我的问题是如何从JavaSWTGUI向这个外部C进程发送CTRL C?我试过了。getRuntime()。链接中提供了exec((kill SIGINT pid):“如何将SIGINT信号从Java发

  • java中一个普通线程需要多少内存。假设没有与之关联的对象。

  • 我正在为android中的knx模块开发一个串口应用程序。我可以向knx modulde发送和接收赞扬。当从serialport接收到消息时,我想更改ui(例如按钮属性)。我用处理程序试过了,但我无法更改ui。帮我一把。 @覆盖公共空OnSerialsData(最终字节[]缓冲区,最终int大小){......} 它是我的串行端口侦听器函数,调用insine ReadThread。此线程从我的活动

  • 对于从lambda跨帐户访问SQS,我需要允许附加到lambda的IAM角色具有SQS权限,还是允许IAM角色在SQS的访问策略中具有权限?(或者两者都做?) 更新:基本上,我已经按照下面一些答案中的建议设置了SQS访问策略。 我得到一份工作 尝试向队列boto3.resource('sqs')发送内容时。队列(“某个队列url”)。send_message(**kwargs))`从lambda,