【问题标题】:instructing one thread to execute code when triggered by another thread指示一个线程在被另一个线程触发时执行代码
【发布时间】:2016-01-12 17:54:33
【问题描述】:

在我的程序中,我正在调用一个带有 ExecutorService 的线程,该线程将运行一段代码,该代码将在应用程序的后台运行,向 gui 发送事件以对其进行更新。当最后满足一个条件时,告诉 gui 重置按钮和计数,线程将结束。

我通过以下方式启动线程:

ExecutorService executor = Executors.newFixedThreadPool(1);
executor.execute(new RunOnTimer(this));
// RunOnTimer starts a thread with that instance of the class

然后线程将一直运行,直到满足条件:

//if this
fireNoMoreFilesEvent();

告诉 gui 重置然后执行器:

executor.shutdown();
executor.awaitTermination(100,TimeUnit.MILLISECONDS);

当我调试时,正在运行的线程被杀死,剩下的就是主线程。现在的问题是当我尝试在同一个程序实例中再次运行相同的执行时,线程启动然后突然退出而不执行任何代码。然后在发生这种情况后,我再次选择要执行的相同代码,它工作正常。

如果我尝试在调试中观察这种行为,代码将运行良好,并且新线程不会在不执行任何操作的情况下退出,所以我的猜测是当新线程发送时主线程和新线程之间发生了一些事情gui 的事件。

是否有一些方法可以让主线程执行新线程会执行的代码?我想要的只是让新线程执行它的运行块并为 gui 发送事件。如果可以的话,有哪些方法可以做到?

【问题讨论】:

  • 事件是否设置了在您再次运行任务之前不会被清除的标志?

标签: java multithreading


【解决方案1】:

如果您在执行程序中重复运行任务,那么我的建议是在程序开始时创建一次执行程序,然后为每个任务使用相同的执行程序。创建多个执行者没有任何价值。每一个都可以执行多个任务。在构建任务时,传入一个任务可以用来表示完成的对象。考虑 Future、CompletableFuture 或 BlockingQueue。此外,您可能需要 CompletionService 而不是 ExecutorService。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 2021-10-12
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 2022-12-31
    相关资源
    最近更新 更多