Tag: threadpoolexecutor

拥有单个线程池比多个线程池更好的设计

在Java中拥有多个线程池有什么优缺点? 我已经看到代码中有多个线程池用于不同的“类型”任务,我不确定它是更好的设计还是只是开发人员是懒惰的。 一个示例是将ScheduledThreadPoolExecutor用于定期执行或超时的任务,并使用另一个ThreadPoolExecutor执行其他任务。

执行程序:如果递归创建任务,如何同步等待所有任务完成?

我的问题与此问题密切相关。 正如在那里发布的那样,我希望主线程等到工作队列为空并且所有任务都已完成。 然而,在我的情况下,问题是每个任务可以递归地导致提交新任务以进行处理。 这使收集所有这些任务的未来变得有点尴尬。 我们当前的解决方案使用忙等待循环来等待终止: do { //Wait until we are done the processing try { Thread.sleep(200); } catch (InterruptedException e) { throw new RuntimeException(e); } } while (!executor.getQueue().isEmpty() || numTasks.longValue() > executor.getCompletedTaskCount()); numTasks是一个在创建每个新任务时增加的值。 这有效但我认为由于忙碌的等待而不是很好。 我想知道是否有一种好方法可以使主线程同步等待,直到被明确唤醒。

如何从Java在Android设备上运行adb screenrecord并结束屏幕记录?

如何从Java在Android设备上运行adb shell screenrecord并结束screenrecording ? 目前我必须指定–time-limit来结束录制。 如果我尝试在结束之前捕获video,则失败。 有没有办法让adb停止录音? 有没有办法配置线程将CTRL-C发送到shell命令? 这将在无根电话上运行。 码 videoExecutor.submit(() -> { //Start recording video String recordVideo = “screenrecord –time-limit ” + testRun.getVideoLength() + ” ” + “/sdcard/” + logDate + “.mp4”; try { device.executeShell(recordVideo); } catch (Exception e1) { e1.printStackTrace(); } sleep(testRun.getVideoLength()*ONE_SECOND + TWO_SECONDS); //gotta match the –time-limit above. RemoteFile remote = new […]

在ThreadPoolExecutor中测试PriorityBlockingQueue

我在这个例子中实现了我的ThreadPoolExecutor和PriorityBlockingQueue: https : //stackoverflow.com/a/12722648/2206775 并写了一个测试: PriorityExecutor executorService = (PriorityExecutor) PriorityExecutor.newFixedThreadPool(16); executorService.submit(new Runnable() { @Override public void run() { try { Thread.sleep(1000); Thread.sleep(1000); System.out.println(“1”); } catch (InterruptedException e) { e.printStackTrace(); } } }, 1); executorService.submit(new Runnable() { @Override public void run() { try { Thread.sleep(1000); Thread.sleep(1000); System.out.println(“3”); } catch (InterruptedException e) { e.printStackTrace(); } } }, […]

预初始化工作线程池以重用连接对象(套接字)

我需要在Java中构建一个工作池,每个工作者都有自己的连接套接字; 当工作线程运行时,它使用套接字但保持打开状态以便以后重用。 我们决定使用这种方法,因为与临时创建,连接和销毁套接字相关的开销需要太多的开销,因此我们需要一种方法,通过这种方法,工作池预先初始化其套接字连接,准备好承担工作同时保持套接字资源免受其他线程的影响(套接字不是线程安全的),所以我们需要沿着这些方向做点什么…… public class SocketTask implements Runnable { Socket socket; public SocketTask(){ //create + connect socket here } public void run(){ //use socket here } } 在应用程序启动时,我们想要初始化工作程序,并希望套接字连接也能以某种方式… MyWorkerPool pool = new MyWorkerPool(); for( int i = 0; i < 100; i++) pool.addWorker( new WorkerThread()); 当应用程序请求工作时,我们将任务发送到工作池以立即执行… pool.queueWork( new SocketTask(..)); 更新了工作代码 基于Gray和jontejj的有用评论,我得到以下代码… SocketTask public class SocketTask […]

ThreadPoolExecutor – 核心和最大池大小

当在方法execute(java.lang.Runnable)提交新任务并且运行的线程少于corePoolSize ,即使其他工作线程处于空闲状态,也会创建一个新线程来处理该请求。 1)如果有空闲线程,为什么需要创建一个新线程来处理请求? 如果有多个corePoolSize但运行的maximumPoolSize线程少于maximumPoolSize ,则只有在队列已满时才会创建新线程。 2)我不明白corePoolSize和maximumPoolSize之间的区别。 其次,当线程小于maximumPoolSize时,如何将队列填满? 如果线程等于或大于maximumPoolSize则队列只能是满的。 不是吗?

无法在RejectionHandler中获取CallableThread

我有线程池,它将带有RejectionHandler Callable工作线程。 我需要在RejectionHandler获取此Callable任务但无法获取它。 在下面的例子中,我需要执行RejectionHandler的可调用任务的uniqueId。 在RejecitonHandler , Runnable是一个FutureTask ,我希望它应该被转换为Callable worker thread。 请帮我在RejectionHandler中获取Callable Worker线程实例。 import java.util.Random; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.Callable; import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.FutureTask; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class RejectionDemo { RejectionDemo(){ Random random = new Random(); ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 1, TimeUnit.SECONDS, new ArrayBlockingQueue(2), new RejectionHandlerImpl()); CallableWorkerThread workers[] = new CallableWorkerThread[10]; for (int […]

在Java中指定任务顺序执行

我搜索了很多但找不到任何解决方案。 我用这样的方式使用java线程池: ExecutorService c = Executors.newFixedThreadPool(3); for (int i = 0; i < 10; ++i) { c.execute(new MyTask(i)); } 以这种方式,任务以后续顺序执行(如在队列中)。 但我需要改变“选择下一个任务”策略。 所以我希望为每个任务分配指定优先级(它不是线程优先级),并且执行任务对应于这些优先级。 因此,当执行程序完成另一个任务时,它会将下一个任务选为具有最高优先级的任务。 它描述了常见问题。 也许有更简单的方法不考虑优先级。 它选择最后添加的任务作为执行而不是第一次添加。 粗略地讲,FixedThreadPool使用FIFO策略。 我可以使用例如LIFO策略吗?

处理ThreadPoolExecutor的exception

我有以下代码片段,它基本上扫描需要执行的任务列表,然后将每个任务提供给执行程序执行。 JobExecutor反过来创建另一个执行程序(用于执行数据库内容…读取和写入数据到队列)并完成任务。 JobExecutor为提交的任务返回Future 。 当其中一个任务失败时,我想优雅地中断所有线程并通过捕获所有exception来关闭执行程序。 我需要做哪些改变? public class DataMovingClass { private static final AtomicInteger uniqueId = new AtomicInteger(0); private static final ThreadLocal uniqueNumber = new IDGenerator(); ThreadPoolExecutor threadPoolExecutor = null ; private List sources = new ArrayList(); private static class IDGenerator extends ThreadLocal { @Override public Integer get() { return uniqueId.incrementAndGet(); } } public void […]

动态线程池

我有一个长时间运行的过程,它监听事件并进行一些密集的处理。 目前我使用Executors.newFixedThreadPool(x)来限制并发运行的作业数,但是根据一天中的时间和其他各种因素,我希望能够动态增加或减少并发线程数。 如果我减少并发线程的数量,我希望当前正在运行的作业能够很好地完成。 是否有一个Java库可以让我控制并动态增加或减少在线程池中运行的并发线程数? (该类必须实现ExecutorService)。 我必须自己实施吗?