指示一个线程在被另一个线程触发时执行代码

时间:2016-01-12 17:54:34

标签: java multithreading

在我的程序中,我正在调用一个带有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发送事件。如果可以的话,有哪些方法可以做到这一点?

1 个答案:

答案 0 :(得分:0)

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

相关问题