java.util.concurrent相关内容
AtomicReference 的语义是什么? 如果我这样做: AtomicReference ref = new AtomicReference(); 然后我: public void someMethod(){ // do something ref.set(loadNewData()); }
..
可能重复: 我想实现一个随时k-分类器,但我找不到一种方法来调用“classify(...)”方法一个特定的时间,暂停它,获得可用的结果之前,该方法被暂停,恢复该方法一段特定的时间,暂停 提前感谢! 解决方案 我发布了一个 PauseableThread 。 您可以使用 ReadWriteLock 实现暂停。如果你暂时抓住一个写锁定,每次你有机会暂停,那么你只需要paus
..
如果网络连接已打开超过几个小时,我使用 ScheduledExecutorService 关闭网络连接。然而,在大多数情况下,网络连接在超时之前关闭,所以我取消 ScheduledFuture 。在这种情况下,我还希望执行器服务终止并释放它的线程池。 令我惊讶的是,这不是开箱即用:虽然我有在执行器服务调度任务后调用 shutdown(),当其唯一的计划任务被取消时,执行器服务不会自动终止。从
..
我正在浏览的源代码,以了解该类提供的原子操作是如何实现原子性的。例如 AtomicInteger.getAndIncrement()方法源如下 public final int getAndIncrement for(;;){ int current = get(); int next = current + 1; if(compareAndSet(current,next)
..
为什么ABQ没有使用LinkedBlockingQueue的方式实现。我们可以使用AtomicInteger来保持ABQ中的轨道计数也与LBQ相同。我们可以使用ABQ的两个锁。 我绊倒了类似的问题。 ArrayBlockingQueue使用单个锁定插入和删除,但LinkedBlockingQueue使用2个独立的锁 但我不明白这个问题的答案。我需要帮助理解,如果我们实现ABQ使用两个锁会出
..
我已阅读过博客,但我不确定他的结论是否正确: http://www.javacodegeeks.com/2010/09/java-best-practices-queue- battle-and.html#ixzz1seaiSLwp 他说:从提供的性能结果可以看出,LinkedBlockingQueue实现了最佳组合 我不知道,如果我没有这样做,那么为什么LinkedBlocki
..
我正在处理一些第三方库代码,涉及创建昂贵的对象并将它们缓存在 Map 中。现有的实现类似于 lock.lock() try { Foo result = cache。 get(key); if(result == null){ result = createFooExpensively(key); cache.put(key,result); } return resu
..
我正在寻找一种暂停一个线程的方法。 我开始使用布尔标志(称为'paused'), while循环(暂停)。 在while循环中有一个 Thread.wait()来阻止执行。 我一直在查看 AtomicBoolean ,它似乎做到了,它不会阻止。 有一个替代或扩展版本的AtomicBoolean,它有一个块方法? ie例如 AtomoicBoolean.get(fals
..
我可以使用Callable线程而不使用ExecutorService吗?我们可以使用Thread的Runnable和子类的实例,而不使用ExecutorService,这段代码正常工作。但是这段代码是一致的: public class Application2 { public static class WordLengthCallable implements Callable {
..
您好,我知道 ConcurrentHashMap before jdk 8 之前的工作方式。 我也理解代码,它是相当模块化,不是很难理解。 ConcurrentHashMap jdk 8的代码已经从以前的实现中改变了很多。 由于问题分类过宽,我会尝试非常具体。 CHMv8使用TreeBin 因此我的问题是什么是使用TreeBin在LinkedList的主要优点。 http:/
..
我需要异步执行任务,而丢弃任何进一步的请求,直到任务完成。 同步方法只是将任务排队,不会跳过。我最初想到使用SingleThreadExecutor,但它也排队任务。然后我查看了ThreadPoolExecutor,但它读取队列以获得要执行的任务,因此将有一个任务执行和最少一个任务排队(其他可以使用ThreadPoolExecutor.DiscardPolicy丢弃)。 我唯一可以想到
..
我有一个多线程应用程序编写和读取ConcurrentLinkedQueue,这在概念上用于回退列表/表中的条目。我最初使用一个ConcurrentHashMap为这,工作很好。需要跟踪订单条目的新要求,因此可以根据一些条件以最旧的第一顺序删除它们。 ConcurrentLinkedQueue似乎是一个不错的选择,在功能上它工作得很好。 可配置的条目数量保存在内存中,当提供一个新条目时,到达时
..
我设置一个由任何线程设置一次的标志。所有其他线程将在不同的时间,经常读这个标志反复。 现在我使用一个AtomicBoolean,它工作正常,但我知道,如果它被频繁地查询它可能比普通布尔,这是真的 )。 是否可以线程安全地改为静态布尔值?将标志设置为true通过谁能做到这一点,事实上,他们可能被允许设置标志几次。 我所关心的是,那些阅读国旗的人能够迅速找到它?会是正确的吗?或者他们
..
我试图将外部非线程安全库集成到我的web项目;我发现,为每个客户端线程创建此对象的实例太贵了。 因此,我想创建一个具有以下属性的对象池。 动态对象创建,池中的对象是动态创建的,而不是在构造函数中创建。池最初为空,并且当客户端线程获取资源对象时,池可以按需创建新的资源。一旦达到创建的对象的数量达到池的大小;那么新的客户端线程将被阻塞,并等待其他线程回收资源。 池应该公平,公平性确保请求
..
我无法找到使用最新JAVA并发例程的此特定案例的示例。 我计划使用线程来处理来自可能包含0到数千个请求的打开队列中的项目。我想限制所以在任何给定的时间有不少于0,不超过10个线程处理队列项。 有一个Java并发进程面向这个特定类型的case? 解决方案 我认为线程池是你正在寻找。查看ExecutorService和Executors。 ExecutorService: h
..
我有32个机器线程和一个 ConcurrentHashMap map ,其中包含大量的键。 键定义了一个公共方法 visit()。我想使用我已经提供的处理能力和可能的某种线程池来 visit() map的每个元素一次。 我可以尝试: 我可以使用方法 map.keys code>。可以使用 nextElement()来迭代结果 Enumeration
..
如果池中的所有线程都在等待同一个池中的排队任务完成,则在正常线程池中会出现线程饥饿死锁。 ForkJoinPool 通过从 join()调用内部的其他线程中窃取工作来避免此问题,而不是简单地等待。例如: private static class ForkableTask extends RecursiveTask { private final CyclicBarri
..
我要写一个多线程网络爬虫。 我的主要入门类有以下代码: ExecutorService exec = Executors.newFixedThreadPool(numberOfCrawlers); while(true){ URL url = frontier.get(); if(url == null) return; exec.execute(new URLCra
..
根据Java Concurrency in Practice,第11.4.3章说: 锁分裂有时可以扩展到分区 锁定一组变量的独立对象,在这种情况下 它被称为锁定条带化。例如, 的实现ConcurrentHashMap使用16个锁的数组,每个锁保护散列桶的1/16 ; bucket N被N mod 16保护。 我仍然有问题来理解和可视化锁条带和桶机制。 有人可以用很好的理解词解
..
如何顺序执行三个线程?例如。 Thread1,Thread2,Thread3。不可能将一个线程的引用传递给另一个线程,并从run()方法调用。 所以代码应该是这样: Thread1.start(); Thread2.start(); Thread3.start(); 并且输出应为 打印Thread1 打印Thread2 打印Thread3
..