我有一些执行器服务可以安排本地任务,例如读取文件、连接到数据库等。这些进程会进行大量的日志记录,这是基于有很多线程并发运行的事实,这是很广泛的,写他们自己的东西进入日志。现在,在某个时间点可以引发异常,它到达捕获所有异常的main方法。然后我将关闭所有服务并取消每项任务,希望阻止所有进一步的消息进入日志。不幸的是,在我关闭所有内容后,这些消息仍然出现...有什么想法吗?更新:这是一些代码publicclassScheduler{privatefinalExecutorServiceservice;privatefinalConcurrentMap>cache;...publicvoid
我有一个多线程实现,我在其中创建一个ExecutorService并提交要执行的任务,我想知道所有线程何时提交都已完成而不阻塞主线程和UI。我试过ExecutorService.awaitTermination()但它会阻塞主线程和UI。我搜索了很多,但我似乎无法找到一种优雅的方式来做到这一点。我目前正在考虑创建另一个线程来计算已完成线程的数量并在它们全部完成时启动一个事件,但这不是一个好方法,我想要一个更好的解决方案! 最佳答案 使用SwingWorker关闭线程池并调用awaitTermination()。这将防止UI阻塞并从您
我有三个连接的线程,即第二个线程在第一个死后执行。这是我的代码:publicclassMain{publicstaticvoidmain(Stringargs[])throwsException{finalThreadthrdA=newThread(()->System.out.println("Message1"));finalThreadthrdB=newThread(()->System.out.println("Message2"));finalThreadthrdC=newThread(()->System.out.println("Message3"));thrdA.sta
我最初是在ThreadPoolExecutor的一个更复杂的子类中看到这个问题,但我已经简化了,所以现在只包含一些额外的调试,但仍然遇到同样的问题。importcom.jthink.songkong.cmdline.SongKong;importcom.jthink.songkong.ui.MainWindow;importcom.jthink.songkong.util.SongKongThreadFactory;importjava.util.concurrent.*;importjava.util.logging.Level;publicclassTimeoutThreadPoo
我在使用ExecutorCompletionService时遇到了以下问题.我想在不同的线程中调用很多Callable。这些Callable不会彼此共享任何信息。我需要为每个Callable定义一个超时,例如。运行时间不要超过5秒。每个Callable都可以在我不知道何时开始的不同时间运行。超时后线程应该被停止/杀死,结果对我来说不再有趣了。不应影响其他“正常”运行的线程。所以让我们以一个简单的可调用对象和我当前的Java代码为例。importjava.util.Date;importjava.util.concurrent.Callable;publicclassJobimpleme
我开始学习ExecutorService类。文档(和在线教程)说总是调用ExecutorService.shutDown()来回收资源。但是,文档还说在您调用shutDown()之后,将不会接受任何新任务。所以,我的问题是,每当我需要并行化数据处理时,我是否总是必须实例化一个新的ExecutorService?现在我有一个可调用对象列表,我执行以下操作。publicvoidsomeMethod(){ListouterCallables=getOuterCallables();ExecutorServiceexecutor=Executor.newFixedThreadPool(NUM_
我有一个宽度为10的固定线程池ExecutorService,以及100个Callable的列表,每个等待20秒并记录它们的中断。我在一个单独的线程中对该列表调用invokeAll,并且几乎立即中断了该线程。ExecutorService执行如预期中断,但Callable记录的实际中断次数远超预期10次——20-40次左右。为什么会这样,如果ExecutorService可以同时执行不超过10个线程?完整源代码:(由于并发性,您可能需要多次运行它)@Testpublicvoidinterrupt3()throwsException{intcallableNum=100;intexecu
我将Callable任务(使用submit())提交给ExecutionService的实现。偶尔我似乎遇到了死锁,但无法在何处工作或为什么发生,所以我想为任务设置超时,但我不清楚该怎么做?我应该在提交任务时在ExecutionService上使用invokeAny()而不是submit()并设置超时。我使用submit()一次提交许多任务,我也可以像这样使用invokeAny()吗,我很谨慎,因为我不明白为什么没有submit()方法需要超时。在我的ExecutorService的构造函数中修改keepAliveTime(但我认为这是在做其他事情修改我实际的Callable实现,但如
我试图了解java.util.concurrent包中的实用程序,并了解到我们可以将callable对象提交给ExecutorService,在call()方法内成功完成任务后,返回Future,其中填充了callable返回的值。我了解到所有可调用项都是使用多个线程同时执行的。当我想看看ExecutorService对批处理任务执行有多大改进时,我想到了捕获时间。以下是我尝试执行的代码-packageconcurrency;importjava.util.ArrayList;importjava.util.List;importjava.util.concurrent.Callabl
我正在用Java编写一个应用程序,它使用ExecutorService来运行多个线程。我希望将多个任务(一次数千个)作为Callables提交给Executor,并在完成后检索它们的结果。我处理这个问题的方法是每次调用submit()函数时,我都会得到一个存储在ArrayList中的Future。后来我将List传递给一个线程,该线程不断迭代它,调用future.get()函数并超时以查看任务是否完成。这是正确的方法还是效率太低?编辑---更多信息---另一个问题是每个Callable需要不同的处理时间。因此,如果我简单地从List中取出第一个元素并对其调用get(),它将阻塞,而其他