Tag: java.util.concurrent

ArrayBlockingQueue:并发put和take

为什么没有使用LinkedBlockingQueue的方式实现ABQ。 我们可以使用AtomicInteger来保持ABQ中的跟踪计数,也与LBQ一样。 我们也可以使用Two Locks for ABQ。 我偶然发现了关于SO的类似问题。 ArrayBlockingQueue使用单个锁进行插入和删除,但LinkedBlockingQueue使用2个单独的锁 但我无法理解这个问题的答案。 我需要帮助来理解如果我们使用两个锁实现ABQ会出现的问题。 如果有人可以举一个可能失败的竞争条件的例子,那将是非常好的。 这个问题可以标记为重复,但我真的在寻找更具描述性的答案。 那将是一个很大的帮助。 我在这里贴了一个代码http://pastebin.com/ZD1uFy7S 。 任何人都可以显示粘贴的代码中是否存在可能的竞争条件。

未来取消方法文档

根据http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html,如果调用了cancel(boolean mayInterruptIfRunning)则isDone返回true 。 此方法返回后,对isDone()的后续调用将始终返回true。 但是,任务可能正在运行且mayInterruptIfRunning设置为false 。 那么,在那次调用之后应该返回什么isDone() ? true因为取消(这是错误的)? 此外,还不清楚cancel(boolean)方法是否返回false 。 PS我正在实现一些简单的线程池,所以我inheritance了Future 。

如何使ScheduledExecutorService在其计划任务被取消时自动终止

我正在使用ScheduledExecutorService来关闭网络连接,如果它已打开超过几个小时。 但是,在大多数情况下,网络连接在达到超时之前关闭,因此我取消了ScheduledFuture 。 在这种情况下,我还希望执行程序服务终止并释放其线程池。 令我惊讶的是,这不是开箱即用的:虽然我在调度任务后在执行程序服务上调用了shutdown() ,但执行程序服务在其唯一的计划任务被取消时不会自动终止。 从ExecutorService.shutdown()的JavaDoc中,这种行为甚至可能是正确的,因为可以说取消的任务还没有被“执行”: void java.util.concurrent.ExecutorService.shutdown() 启动有序关闭,其中先前提交的任务将被执行,但不会接受任何新任务。 如果已经关闭,调用没有其他影响。 我的问题是,是否可以更改:是否可以将执行程序服务配置为在其唯一的计划任务被取消时自动终止? 或者写为JUnit测试的同一个问题: @Test public void testExecutorServiceTerminatesWhenScheduledTaskIsCanceled() throws Exception { ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); Runnable task = new Runnable() { @Override public void run() { // … } }; ScheduledFuture scheduledTask = scheduler.schedule(task, 2000, TimeUnit.MILLISECONDS); scheduler.shutdown(); // do more configuration here… Thread.sleep(1000); scheduledTask.cancel(false); Thread.sleep(100); assertThat(scheduler.isTerminated(), […]

Java中的巧妙异步重绘

我有一个用例来自GUI问题,我想提交给你的睿智。 用例 我有一个GUI,根据用户在GUI中设置的一些参数显示计算结果。 例如,当用户移动滑块时,会触发几个事件,这些事件都会触发新的计算。 当用户将滑块值从A调整为B时,会触发数十个事件。 但是计算可能需要几秒钟,而滑块调整可以每隔几百毫秒触发一次事件。 如何编写一个能够监听这些事件的正确线程,并对它们进行过滤以使结果的重绘更加生动? 理想情况下,你会喜欢这样的东西 收到第一次更改事件后立即开始新的计算; 如果收到新事件则取消第一次计算,并用新参数开始新计算; 但要确保最后一个事件不会丢失,因为最后完成的计算需要是具有最后更新参数的计算。 我试过的 我的一个朋友(A. Cardona)提出了一种更新程序线程的低级方法,可以防止太多事件触发计算。 我在这里复制粘贴(GPL): 他把它放在一个扩展Thread的类中: public void doUpdate() { if (isInterrupted()) return; synchronized (this) { request++; notify(); } } public void quit() { interrupt(); synchronized (this) { notify(); } } public void run() { while (!isInterrupted()) { try { final long r; synchronized (this) […]

MultiThreading与ThreadPoolExecutor

我在我写的许多应用程序中使用过multithreading。 在阅读更多内容时,我遇到了ThreadPoolExecutors 。 我无法区分这两种情况。 我仍然理解的是,当我有一项任务时,我应该使用multithreading我想将任务分成多个小任务来利用CPU并更快地完成工作。 当我设置任务时,使用ThreadPoolExecutor ,每个任务可以相互独立运行。 如果我错了,请纠正我。 谢谢

Hystrix命令失败,显示“超时且无可用后备”

我注意到我的应用程序中的一些命令失败了 Caused by: ! com.netflix.hystrix.exception.HystrixRuntimeException: GetAPICommand timed-out and no fallback available. out: ! at com.netflix.hystrix.HystrixCommand.getFallbackOrThrowException(HystrixCommand.java:1631) out: ! at com.netflix.hystrix.HystrixCommand.access$2000(HystrixCommand.java:97) out: ! at com.netflix.hystrix.HystrixCommand$TimeoutObservable$1$1.tick(HystrixCommand.java:1025) out: ! at com.netflix.hystrix.HystrixCommand$1.performBlockingGetWithTimeout(HystrixCommand.java:621) out: ! at com.netflix.hystrix.HystrixCommand$1.get(HystrixCommand.java:516) out: ! at com.netflix.hystrix.HystrixCommand.execute(HystrixCommand.java:425) out: Caused by: ! java.util.concurrent.TimeoutException: null out: !… 11 common frames omitted 这是我的Hystrix配置覆盖: hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=210000 hystrix.threadpool.default.coreSize=50 hystrix.threadpool.default.maxQueueSize=100 hystrix.threadpool.default.queueSizeRejectionThreshold=50 这是什么样的超时? 它是外部应用程序的读/连接超时吗? 我该如何调试呢?

Java中的目录扫描程序

连续扫描一组目录以获取一组文件名filter。 对于到达的每个文件名filter,处理文件并重复所有步骤 在jdk 1.5中可能推荐的设计是什么,可能使用java.concurrent.Executor和Future

java.util.concurrent.Executor如何工作?

java.util.concurrent.Executor如何创建“真正的”线程? 假设我正在实现Executor或使用任何执行程序服务(如ThreadPoolExecutor)。 JVM内部如何工作?

是否适合使用AtomicReference.compareAndSet来设置对数据库调用结果的引用?

我正在实现一个简单的缓存,缓存存储为AtomicReference。 private AtomicReference<Map> cacheData; 应该从数据库表中填充(延迟)缓存对象。 我提供了一种方法来将缓存数据返回给调用者,但如果数据为空(即未加载),则代码需要从数据库加载数据。 为避免同步我想到使用compareAndSet()方法: public Object getCacheData() { cacheData.compareAndSet(null, getDataFromDatabase()); // atomic reload only if data not set! return Collections.unmodifiableMap(cacheData.get()); } 以这种方式使用compareAndSet是否可以。 将数据库调用作为primefaces操作的一部分? 是否比同步方法更好/更差? 非常感谢任何建议..

为什么jdk中没有ConcurrentLinkedHashMap类?

这个问题直接来自我在SO的上一个问题 。 我认为我的第二个问题的答案是否定的。 所以我想理解为什么java.util.concurrent包中没有ConcurrentLinkedHashMap? 我的意思是有一个ConcurrentHashMap但没有ConcurrentLinkedHashMap。 在Concurrent环境中拥有这样的类是否完全没有意义? 我的意思是这里的主要技术原因是它的不可用性? 在Guava / Apache Commons中有类似的东西吗?