Tag: 执行器

Java预定执行程序的准确性

我在使用Java预定执行程序时遇到了一个特殊问题,并且想知道我所经历的是否正常。 我需要安排以5秒的预定义速率执行的任务。 预计这些任务将不时需要超过5秒的时间执行,但是当运行它们的时间低于5秒时,备份的任务列表应该快速连续运行以赶上。 在运行任务时,重要的是要知道原始计划执行时间是什么(想想java.util.TimerTask scheduledExecutionTime() )。 最后,我需要跟踪预定时间和实际时间之间的差异,以确定时间表“漂移”的时间和数量。 到目前为止,我已经使用Java执行器实现了所有这些,下面的类说明了一般的想法: public class ExecutorTest { public static final long PERIOD = 5000; public static void main(String[] args) { Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate( new Command(), 0, PERIOD, TimeUnit.MILLISECONDS); } private static final class Command implements Runnable { long timestamp = 0; public void run() { long now = System.currentTimeMillis(); if (timestamp == […]

优雅地将队列长度指示符实现到ExecutorServices

为什么,为什么java.util.concurrent没有为其ExecutorService提供队列长度指示器? 最近我发现自己做了这样的事情: ExecutorService queue = Executors.newSingleThreadExecutor(); AtomicInteger queueLength = new AtomicInteger(); … public void addTaskToQueue(Runnable runnable) { if (queueLength.get() < MAX_QUEUE_LENGTH) { queueLength.incrementAndGet(); // Increment queue when submitting task. queue.submit(new Runnable() { public void run() { runnable.run(); queueLength.decrementAndGet(); // Decrement queue when task done. } }); } else { // Trigger error: too long queue […]

如何进入FutureTask执行状态?

我有一个singleThreadExecutor,以执行我按顺序提交给它的任务,即一个接一个的任务,没有并行执行。 我有runnable这样的东西 MyRunnable implements Runnable { @Override public void run() { try { Thread.sleep(30000); } catch (InterruptedException e1) { e1.printStackTrace(); } } 例如,当我向上述单线程执行程序提交三个MyRunnable实例时,我希望第一个任务执行,因为Thread.sleep在TIMED_WAITING中有执行线程(我可能错误的具体州)。 其他两个任务不应该分配线程来执行它们,至少在第一个任务完成之前不会。 所以我的问题是如何通过FutureTask API获取此状态或以某种方式到达正在执行任务的线程(如果没有这样的线程然后任务等待执行或挂起)并获得其状态或者可能由某些其他方式? FutureTask只定义了isCanceled()和isDone()方法,但这些方法还不足以描述Task的所有可能的执行状态。

具有限制/吞吐量控制的Java Executor

我正在寻找一个Java Executor,它允许我指定限制/吞吐量/起搏限制,例如,不超过100个任务可以在一秒钟内处理 – 如果更多的任务被提交,他们应该排队并稍后执行。 这样做的主要目的是避免在访问外部API或服务器时遇到限制。 我想知道基础Java(我怀疑,因为我检查过)或其他可靠的地方(例如Apache Commons)是否提供了这个,或者我是否必须编写自己的。 最好是轻量级的。 我不介意自己写,但如果某个地方有“标准”版本,我至少要先看一下。

ScheduledExecutorService,如何在不停止执行程序的情况下停止操作?

我有这个代码: ScheduledExecutorService scheduledExecutor; ….. ScheduledFuture result = scheduledExecutor.scheduleWithFixedDelay( new SomethingDoer(),0, measurmentPeriodMillis, TimeUnit.MILLISECONDS); 在某些事件之后我应该停止操作,它在SomethingDoer run()方法中声明,它实现了Runnable 。 我怎样才能做到这一点? 我无法关闭执行程序,我应该只撤销我的周期性任务。 我可以使用result.get()吗? 如果可以,请告诉我它将如何运作。

与另一个任务并行运行任务

我有以下使用FooProcessor类的Foo类。 所以我想要做的是,在运行cp1实例进程方法的同时,我想运行cp2.process() 。 public class Foo { public static void main(String [] args){ FooProcessor cp1 = new FooProcessor(); FooProcessor cp2 = new FooProcessor(); cp1.process(); // in parallel process cp2.process(); } } public class FooProcessor { public void process(){ System.out.println(“Processing..”); } } 但是,我想顺序cp1,所以我希望它运行并完成,如果cp2没有完成或失败它是好的。 如果它失败了我想加入结果。 它没有返回此示例中的任何内容,但我想返回结果。 为此,应该使用TaskExecutor吗? 还是线程? 我只希望cp2与cp1并行运行。 或者如果我添加更多让我们说cp3,我希望它与cp1并行运行。

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

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

使用TaskExecutor示例的任何好的Spring线程?

我试图了解如何在使用Spring进行事务管理的Java应用程序中实现线程。 我在Spring文档中找到了TaskExecutor部分,而ThreadPoolTask​​Executor看起来很符合我的需求; ThreadPoolTask​​Executor类 此实现只能在Java 5环境中使用,但也是该环境中最常用的实现。 它公开了bean属性,用于配置java.util.concurrent.ThreadPoolExecutor并将其包装在TaskExecutor中。 如果您需要一些高级的东西,例如ScheduledThreadPoolExecutor,建议您使用ConcurrentTaskExecutor。 但是我不知道如何使用它。 我一直在寻找好的例子现在没有运气。 如果有人可以帮助我,我会很感激。