我有一个应用程序,它在一个单独的线程中的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();
}
}
还有其他干净的方法吗?
您可以获得[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的引用,您可以在收到信号时关闭线程池。
你们必须检查线程。在循环中中断(),以便在系统出现任何问题时将其关闭。退出()。然后你可以使用线程。interrupt(),这是ExecutorService。shutdown()仍使用。如果它不起作用,请向我们展示如何检查isInterrupted()的代码,以便我们可以修复它。线stop()存在,但有充分理由不推荐使用,因此不应使用。
还有其他干净的方法吗?不。坚持使用(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,