Tag: 并发线程

如何在scheduleWithFixedDelay抛出exception时重新启动计划?

我使用ScheduledExecutorService来安排一些需要定期运行的任务。 我想知道这个代码是否可以在发生exception时恢复计划。 ScheduledExecutorService service = Executors.newScheduledThreadPool(1); this.startMemoryUpdateSchedule(service);//See below method //Recursive method to handle exception when run schedule task private void startMemoryUpdateSchedule(ScheduledExecutorService service) { ScheduledFuture future = service.scheduleWithFixedDelay(new MemoryUpdateThread(), 1, UPDATE_MEMORY_SCHEDULE, TimeUnit.MINUTES); try { future.get(); } catch (ExecutionException e) { e.printStackTrace(); logger.error(“Exception thrown for thread”,e); future.cancel(true); this.startMemoryUpdateSchedule(service); } catch(Exception e) { logger.error(“Other exception “,e); } }

是否有两个ExecutorServices可以共享一个线程池?

我有一组要处理的记录,并且处理可以并行化,所以我创建了一个ExecutorService (通过Executors#newCachedThreadPool() )。 单个记录的处理本身由可并行化的步骤组成,因此我想使用另一个ExecutorService 。 是否有一种简单的方法可以使这个新的使用相同的底层线程池? 它甚至可取吗? 谢谢。

ExecutorService中的持久变量(Java)

我已经创建了一个包含4个工作线程的池来处理一些文件。 在测试中,大约有200个。 线程池版本已经比顺序执行快3倍,但还有改进的余地。 最大的瓶颈(忽略磁盘I / O)是我需要实例化一个新的MessageDigest对象。 在单线程版本中我只有1.在这个版本中我有200。 我想知道的是,是否有可能在工作池中有一个本地变量? 这样(假设没有线程死亡)只有MessageDigest对象的四个实例而不是200 … 每个任务都需要摘要,所以我不确定是否有更好的方法来做… UPDATE 我试图使用ThreadLocal对象,但我应该在哪里创建它? 如果我在任务本身创建它,我想它在任务完成时就会脱离上下文。 每次创建新实例时。 我的代码是: ThreadLocal tl = new ThreadLocal(); hashMaker = tl.get(); if(hashMaker == null){ hashMaker = new GenerateSHA1(); tl.set(hashMaker); } 这是从任务的构造函数内部完成的。 UPDATE 好吧,让它成为静态的工作,因为对象不会丢失 – 但它现在突出显示了一个不同的问题。 工作“任务”在主线程中创建,然后使用invokveAll()添加到ExecutorService。 关于如何解决这个问题的任何想法?

在Java中运行基于cpu的简单程序的最佳线程池大小是多少

我使用线程池来执行任务,这些任务主要是基于cpu的I / O,大小比cpus的数量大1。 Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1) 假设简单程序将其所有任务提交给此执行程序并且几乎没有其他情况我假设拥有一个更大的线程池会减慢速度,因为操作系统必须将它更频繁地cpus,因为它更经常有机会给线程池中的每个线程一个机会跑。 这是正确的,如果这是一个真正的问题或主要是理论上的,即如果我将线程池大小增加到1000我会注意到一个巨大的差异。