Tag: multithreading线程

Future.get(超时)的基础线程行为

我们正在使用Future以超时来完成任务。 当时间限制超过时,我们会收到TimeOutException 。 从thread dump的行为,我意识到底层线程继续。 是这样的吗? 如何处理漫游的multithreading? 如果从池中删除的线程没有IOException ,该怎么办? 如果这是真的,那么kill底层线程的方法是什么。 在我的情况下,它一直在等待外部IO 。 线程转储的一部分: Thread 29587: (state = IN_NATIVE) – java.net.SocketInputStream.socketRead0(java.io.FileDescriptor, byte[], int, int, int) @bci=0 (Compiled frame; information may be imprecise) – java.net.SocketInputStream.read(byte[], int, int) @bci=84, line=129 (Compiled frame) – java.io.BufferedInputStream.fill() @bci=175, line=218 (Compiled frame) – java.io.BufferedInputStream.read1(byte[], int, int) @bci=44, line=258 (Compiled frame) – java.io.BufferedInputStream.read(byte[], […]

Java:当线程池中的所有线程都完成时,通知主类/不同线程中对象的相同实例

当ThreadPoolExecutor所有线程都完成后,如何通知我的主类实例化ThreadPoolExecutor ? ThreadPoolExecutor threadPool = null; ThreadClass threadclass1; ThreadClass threadclass2; final ArrayBlockingQueue queue = new ArrayBlockingQueue(maxPoolSize); puclic MyClass(){ threadPool = new ThreadPoolExecutor(poolSize, maxPoolSize, keepAliveTime, TimeUnit.SECONDS, queue); threadClass1 = new ThreadClass; threadClass2 = new ThreadClass; threadPool.execute(threadClass1); threadPool.execute(threadClass2); //Now I would like to do something until the threadPool is done working //The threads fill a ConcurrentLinkedQueueand I […]

ScheduledThreadPoolExecutor和corePoolSize 0?

我想要一个ScheduledThreadPoolExecutor ,如果没有工作要做,它也会停止最后一个线程,如果有新任务,则创建(并保持线程活动一段时间)。 但是,一旦没有更多工作要做,它应该再次丢弃所有线程。 我天真地将它创建为new ScheduledThreadPoolExecutor(0)但结果是,没有创建任何线程,也没有执行任何计划任务。 任何人都可以告诉我,如果我没有在ScheduledThreadpoolExecutor周围编写自己的包装器就可以实现我的目标吗? 提前致谢!

创建动态(增长/缩小)线程池

我需要在Java中实现一个线程池(java.util.concurrent),其空闲时线程数达到某个最小值,当作业提交到它上面的速度超过完成执行时,它会增长到上限(但绝不会更远) ,当完成所有作业并且不再提交作业时,缩小回到下限。 你会如何实现这样的东西? 我想这将是一个相当常见的使用场景,但显然java.util.concurrent.Executors工厂方法只能创建固定大小的池和池,当提交许多作业时,这些池和池会无限增长。 ThreadPoolExecutor类提供了corePoolSize和maximumPoolSize参数,但是它的文档似乎暗示了同时拥有多个corePoolSize线程的唯一方法是使用有界作业队列,在这种情况下,如果你已达到maximumPoolSize线程,你会得到拒绝工作,你必须自己处理? 我想出了这个: //pool creation ExecutorService pool = new ThreadPoolExecutor(minSize, maxSize, 500, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(minSize)); … //submitting jobs for (Runnable job : …) { while (true) { try { pool.submit(job); System.out.println(“Job ” + job + “: submitted”); break; } catch (RejectedExecutionException e) { // maxSize jobs executing concurrently atm.; re-submit new job […]

将给定ID的任务绑定到同一线程的线程池

是否存在线程池(在Java中)的任何实现,以确保在同一线程上执行相同逻辑ID的所有任务? 我所追求的逻辑是,如果已经在给定逻辑ID的特定线程上执行了任务,则在同一线程上调度具有相同ID的新任务。 如果没有线程为同一ID执行任务,则可以使用任何线程。 这将允许并行执行不相关ID的任务,但是同一ID的任务将以串行和提交的顺序执行。 如果没有,是否有任何关于如何扩展ThreadPoolExecutor以获得此行为的建议(如果可能的话)? UPDATE 花了更长时间考虑这个问题,我实际上并不要求在同一个线程上执行相同逻辑ID的任务,只是它们不会同时执行。 这方面的一个例子是处理客户订单的系统,可以同时处理多个订单,但不能同一个客户(并且必须按顺序处理同一客户的所有订单)。 我现在采用的方法是使用标准的ThreadPoolExecutor,使用自定义的BlockingQueue并使用自定义包装器包装Runnable 。 Runnable包装器逻辑是: primefaces地尝试将ID添加到并发“运行”集( ConcurrentHashMap )以查看当前是否正在运行相同ID的任务 如果添加失败,请将任务重新推送到队列的前面并立即返回 如果成功,继续 运行任务 从“正在运行”的集合中删除任务的关联ID 然后队列的poll()方法只返回具有当前不在“运行”集中的ID的任务。 这样做的麻烦在于我确信会有很多我没有想过的极端情况,因此需要进行大量的测试。

java中线程池的类型

java中的线程池有哪些类型。 我需要实现一个使用繁重计算的健壮的multithreading应用程序,我应该使用哪个线程池?

在Java ThreadPool上感到困惑

在我遇到这个链接之后,这是我第一次使用Java Thread Pool进行我的新项目http://www.javacodegeeks.com/2013/01/java-thread-pool-example-using-executors-and-threadpoolexecutor .html ,我对此更加困惑,这里是来自页面的代码, package com.journaldev.threadpool; public class WorkerThread implements Runnable { private String command; public WorkerThread(String s){ this.command=s; } @Override public void run() { System.out.println(Thread.currentThread().getName()+’ Start. Command = ‘+command); processCommand(); System.out.println(Thread.currentThread().getName()+’ End.’); } private void processCommand() { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } @Override public String toString(){ return […]

使用ThreadPoolExecutor的活动任务数

我正在使用ThreadPoolExecutor在我的Java应用程序中执行任务。 我有一个要求,我想在执行程序队列中的任何时间点获取队列中的活动任务数。 我查看了ThreadPoolExecutor的javadoc ,发现了两个相关的方法: getTaskCount()和getTaskCount() getCompletedTaskCount() 。 根据文档,我可以分别从上述两种方法中获得计划任务和已完成任务的数量。 但我无法找到在任何时间点获取队列中活动任务数的解决方案。 我可以这样做: getTaskCount() = getCompletedTaskCount() + failed tasks + active tasks 但是,无法直接获得失败任务的数量以达到预期的计算。 我在这里错过了什么吗?

如何实现ExecutorService以轮换为基础执行任务?

我正在使用带有固定线程池的 java.util.concurrent.ExecutorService来执行任务列表。 我的任务列表通常大约是80到150,我将任何时候运行的线程数限制为10,如下所示: ExecutorService threadPoolService = Executors.newFixedThreadPool(10); for ( Runnable task : myTasks ) { threadPoolService.submit(task); } 我的用例要求甚至已完成的任务应该再次重新提交给ExecutorService,但只有在所有已提交的任务都得到服务/完成时才应该执行/再次执行。 基本上,提交的任务应该以轮换方式执行。 因此,在这种情况下,不会有threadPoolService.shutdown()或threadPoolService.shutdownNow()调用。 我的问题是,如何实现ExecutorService服务轮换基础任务?

如何创建LIFO执行器?

我想创建一个线程池,它将执行最近提交的任务。 关于如何实现这一点的任何建议? 谢谢