Tag: executorservice

如何以multithreading方式调用不同类的相同方法

我在我的两个类中有一个名为process的方法,比如说CLASS-A and CLASS-B 。 现在在下面的循环中,我调用我的两个类的process method顺序意义一个接一个,它工作正常,但这不是我想要的方式。 for (ModuleRegistration.ModulesHolderEntry entry : ModuleRegistration.getInstance()) { final Map response = entry.getPlugin().process(outputs); // write to database System.out.println(response); } 有什么办法,我可以用multithreading方式调用我的两个类的进程方法。 这意味着一个线程将调用CLASS-A的进程方法,第二个线程将调用CLASS-B的进程方法。 之后我想将process方法返回的数据写入数据库。 所以我可以再写一个线程来写入数据库。 下面是我以multithreading方式提出的代码,但不知何故它根本没有运行。 public void writeEvents(final Map data) { // Three threads: one thread for the database writer, two threads for the plugin processors final ExecutorService executor = Executors.newFixedThreadPool(3); final […]

我们是否需要关闭ExecutorService fixedThreadPool

我使用ExecutorService创建了threadpool,在我的应用程序中使用下面的代码调用供应商websrvice。 ExecutorService executor = Executors.newFixedThreadPool(getThreadPoolSize()); for (int i = 0; i < list.size(); i++) { Request ecpReq = list.get(i); thRespLst.add(executor.submit(new Task(ecpReq))); } 想要知道我们需要关注线程池或其他东西,基本上我不想在生产环境中挂线程。

Java:带有Callables的ExecutorService:invokeAll()和future.get() – 结果是否正确?

我使用Java中的ExecutorService来调用带有invokeAll()线程。 之后,我使用future.get()获取结果集。 以我创建线程的相同顺序收到结果非常重要。 这是一个片段: try { final List threads = new ArrayList(); // create threads for (String name : collection) { final CallObject object = new CallObject(name); threads.add(object); } // start all Threads results = pool.invokeAll(threads, 3, TimeUnit.SECONDS); for (Future future : results) { try { // this method blocks until it receives the result, […]

如何在使用具有线程超时function的ExecutorService时提高性能?

我不是multithreading专家,但我发现当前使用ExecutorService代码存在一些性能问题。 我正在开发一个项目,在这个项目中我需要对我的服务器进行HTTP URL调用,如果响应时间过长则会超时。 目前它正在返回简单的JSON字符串.. 我当前的要求是10 ms 。 在10 ms它应该能够从服务器获取数据。 我猜它是可能的,因为它只是对同一数据中心内的服务器的HTTP调用。 我的客户端程序和实际服务器在同一个数据中心内,并且它们之间的ping时间延迟为0.5 ms ,所以它应该是可行的。 我正在使用RestTemplate进行URL调用。 下面是我为我编写的使用ExecutorService和Callables – public class URLTest { private ExecutorService executor = Executors.newFixedThreadPool(10); public String getData() { Future future = executor.submit(new Task()); String response = null; try { System.out.println(“Started..”); response = future.get(100, TimeUnit.MILLISECONDS); System.out.println(“Finished!”); } catch (TimeoutException e) { System.out.println(“Terminated!”); } catch (InterruptedException […]

如何实现或找到线程安全的CompletionService的等价物?

我有一个在Tomcat容器中运行的简单Web服务,它本质上是multithreading的。 在进入服务的每个请求中,我想要对外部服务进行并发调用。 java.util.concurrent中的ExecutorCompletionService使我部分得到了。 我可以为它提供一个线程池,它将负责执行我的并发调用,当任何结果准备就绪时我会收到通知。 处理特定传入请求的代码可能如下所示: void handleRequest(Integer[] input) { // Submit tasks CompletionService completionService = new ExecutorCompletionService(Executors.newCachedThreadPool()); for (final Integer i : input) { completionService.submit(new Callable() { public Integer call() { return -1 * i; } }); } // Do other stuff… // Get task results try { for (int i = 0; i < […]

无法停止使用ExecutorService启动的任务

对不起,我必须打开一个新线程来描述这个问题。 今天早上我问了这个问题 ,有一些回复,但我的问题仍未解决。 这次我将附加一些可运行的代码(简化但有相同的问题),以便您重现问题: public class ThreadPoolTest { public static void main(String[] args) throws Exception { final ExecutorService taskExecutor = Executors.newFixedThreadPool(5); Future futures[] = new Future[5]; for (int i = 0; i < futures.length; ++i) futures[i] = startTask(taskExecutor); for (int i = 0; i < futures.length; ++i) System.out.println("futures[i].cancel(true): " + futures[i].cancel(true)); System.out.println("Cancel DONE."); taskExecutor.shutdown(); } […]

知道所有线程何时完成并处理exception

我正在使用Executor框架使用线程池启动多个线程,即newFixedThreadPool。 我使用threadpool.submit(aThread)来提交要由线程池执行的作业,这很好但是我需要确定所有线程何时完成,以便我可以继续进行其他处理。 我看着使用Future.get()阻塞直到线程完成这里的问题是它阻塞直到结果可用。 我还看到在发出关闭后继续调用isTerminated()方法然后调用sleep来检查是否所有线程都已完成,但这对我来说似乎并不整齐。 还有另一种清洁方式吗? 此外,如果在任何一个线程中引发exception,我希望能够终止所有其他正在运行的线程,并且还要阻止池中任何排队的线程启动。 这样做的最佳机制是什么? 期待听到您的回复 TIA

newFixedThreadPool()vs newCachedThreadPool()

如果newCachedThreadPool()根据需要创建一个线程池,根据需要创建新线程,但是在它们可用时将重用先前构造的线程,而在newFixedThreadPool(int size)情况下,指定大小以创建指定大小的线程池。 为什么newFixedThreadPool(int size)不是以newCachedThreadPool()方式实现的,其中线程池仅在需要时创建新线程并将线程限制为大小? 对上述内容的任何澄清都非常有用。

ExecutorService,如何知道所有线程何时完成而不阻塞主线程?

我有一个multithreading实现,我创建一个ExecutorService并提交要执行的任务,我想知道所有线程被提交的时间已经完成而没有阻塞主线程和UI。 我已经尝试过ExecutorService.awaitTermination()但它阻止了主线程和UI。 我搜索了很多,但我似乎无法找到一种优雅的方式来做到这一点。 我正在考虑创建另一个线程来计算完成的线程数量,并在它们全部完成时启动一个事件,但这不是一个好方法,我想要一个更好的解决方案!

ExecutorService应该是静态的还是全局的

我想在整个应用程序中使用相同的线程池。 为此,我可以使ExecutorService静态和全局的,这样我就可以在需要时调用ThreadUtil.executorService来获取ExecutorService 。 public class ThreadUtil { public static final ExecutorService executorService = Executors.newCachedThreadPool(); } 可以像这样实例化多个线程池吗? 另外,我的应用程序是TCP服务器。 如果我不知道池应该有多大,可以简单地使用newCachedThreadPool吗?