Questions tagged «concurrency»

在计算机科学中,并发是系统的属性,其中可以在重叠的时间段内执行多个计算。这些计算可以在同一芯片的多个内核上执行,也可以在同一处理器上抢占时间共享线程,或者在物理上分开的处理器上执行。


13
不可能使缓存的线程池具有大小限制吗?
限制缓存线程池的创建数量似乎是不可能的。 这是在标准Java库中实现static Executors.newCachedThreadPool的方式: public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); } 因此,使用该模板继续创建固定大小的缓存线程池: new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new SynchronusQueue<Runable>()); 现在,如果您使用它并提交3个任务,一切都会好起来的。提交任何其他任务将导致拒绝执行异常。 试试这个: new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runable>()); 将导致所有线程按顺序执行。即,线程池将永远不会产生多个线程来处理您的任务。 这是ThreadPoolExecutor的execute方法中的错误吗?还是这是故意的?还是有其他方法? 编辑:我想要的东西完全类似于缓存的线程池(它会按需创建线程,然后在超时后将其杀死),但是它可以创建的线程数受到限制,并且一旦有线程就可以继续排队其他任务达到其线程限制。根据sjlee的答复,这是不可能的。查看ThreadPoolExecutor的execute()方法确实是不可能的。我将需要像SwingWorker一样子类化ThreadPoolExecutor并重写exe​​cute(),但是SwingWorker在execute()中所做的事情是一个完整的技巧。

12
如何在Java中异步调用方法
我最近一直在研究Go的goroutine,并且认为在Java中拥有类似的东西会很好。就我搜索的并行化方法调用的通用方法而言,它是执行以下操作: final String x = "somethingelse"; new Thread(new Runnable() { public void run() { x.matches("something"); } }).start(); 那不是很优雅。有更好的方法吗?我在项目中需要这样的解决方案,因此我决定围绕异步方法调用实现自己的包装器类。 我在J-Go中发布了包装器类。但是我不知道这是否是一个好的解决方案。用法很简单: SampleClass obj = ... FutureResult<Integer> res = ... Go go = new Go(obj); go.callLater(res, "intReturningMethod", 10); //10 is a Integer method parameter //... Do something else //... System.out.println("Result: "+res.get()); //Blocks until …


6
GCD中的并发与串行队列
我正在努力完全理解GCD中的并发和串行队列。我遇到了一些问题,希望有人能及时明确地回答我。 我正在阅读串行队列的创建和使用,以便依次执行任务。但是,如果发生以下情况,会发生什么情况: 我创建一个串行队列 我使用dispatch_async了3次(在我刚刚创建的串行队列中)分配了三个块A,B,C 将执行以下三个块: 按顺序A,B,C,因为队列是串行的 要么 并发(同时在并行线程上),因为我使用了ASYNC调度 我读到我可以dispatch_sync在并发队列上使用,以便一个接一个地执行块。在那种情况下,为什么甚至不存在串行队列,因为我始终可以使用并发队列,在该队列中可以同步分配任意数量的块? 感谢您的任何解释!

5
如何使用CancellationToken属性?
与前面的RulyCanceler类代码相比,我想使用来运行代码 CancellationTokenSource。 如取消令牌中所述,如何使用它,即不引发/捕捉异常?我可以使用IsCancellationRequested财产吗? 我试图这样使用它: cancelToken.ThrowIfCancellationRequested(); 和 try { new Thread(() => Work(cancelSource.Token)).Start(); } catch (OperationCanceledException) { Console.WriteLine("Canceled!"); } 但这cancelToken.ThrowIfCancellationRequested();在方法中产生了运行时错误Work(CancellationToken cancelToken): System.OperationCanceledException was unhandled Message=The operation was canceled. Source=mscorlib StackTrace: at System.Threading.CancellationToken.ThrowIfCancellationRequested() at _7CancellationTokens.Token.Work(CancellationToken cancelToken) in C:\xxx\Token.cs:line 33 at _7CancellationTokens.Token.<>c__DisplayClass1.<Main>b__0() in C:\xxx\Token.cs:line 22 at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, …

6
AtomicInteger lazySet与set
lazySet和的set方法有AtomicInteger什么区别?该文档没有太多关于lazySet: 最终设置为给定值。 似乎存储的值不会立即设置为所需值,而是计划在将来的某个时间设置。但是,这种方法的实际用途是什么?有什么例子吗?
116 java  concurrency  atomic 


5
LinkedBlockingQueue与ConcurrentLinkedQueue
我的问题涉及到这个问题,刚才问。在使用队列在生产者线程与使用者线程之间进行通信的情况下,人们通常会建议使用LinkedBlockingQueue或ConcurrentLinkedQueue吗? 与另一种相比,使用一种有什么优点/缺点? 从API角度看,我的主要区别是a LinkedBlockingQueue可以有选择地限制。

7
哪个对node.js上的并发任务更好?纤维?网络工作者?还是线程?
我前一段时间偶然发现了node.js,非常喜欢。但是很快我发现它严重缺乏执行CPU密集型任务的能力。因此,我开始使用Google搜索,并找到了解决这些问题的答案:光纤,Webworkers和线程(go-a-gogo)。现在使用哪个是一个混乱的问题,肯定需要使用其中的一个-毕竟,拥有一台只擅长IO且无其他优点的服务器的目的是什么?需要建议! 更新: 我在想一种落后的方法。只是需要建议。现在,我想到的是:让我们来一些线程(使用thread_a_gogo或webworkers)。现在,当我们需要更多它们时,我们可以创建更多。但是在创建过程中会有一些限制。(不是系统暗示的,但可能是因为开销)。现在,当我们超过限制时,我们可以派生一个新节点,并开始在该节点上创建线程。这样,它可以一直持续到我们达到某个极限(毕竟,过程也有很大的开销)。当达到此限制时,我们开始排队任务。每当线程空闲时,就会为它分配一个新任务。这样,它可以顺利进行。 所以,这就是我的想法。这个主意好吗?我对所有这些过程和线程东西还是有点陌生​​,所以没有任何专业知识。请分享您的意见。 谢谢。:)

4
挥发物贵吗?
在阅读了有关volatile的实现的JSR-133编译器厨师手册之后,尤其是“与原子指令的交互”部分,我认为读取volatile变量而不更新它需要LoadLoad或LoadStore屏障。在页面的下方,我看到在X86 CPU上,LoadLoad和LoadStore实际上是无操作的。这是否意味着无需在x86上显式地使缓存无效就可以进行volatile读操作,并且它与普通变量读取一样快(不考虑volatile的重新排序约束)? 我相信我无法正确理解。有人可以启发我吗? 编辑:我想知道在多处理器环境中是否存在差异。如John V.所述,在单CPU系统上,CPU可能会查看其自己的线程缓存,但是在多CPU系统上,必须为CPU提供一些配置选项,这还不够,必须命中主内存,从而使volatile速度变慢在多CP​​U系统上,对吗? PS:在学习更多相关信息的过程中,我偶然发现了以下精彩文章,由于这个问题可能会让其他人感兴趣,因此我将在这里分享我的链接: Java理论与实践:修复Java内存模型,第1部分和 Java理论与实践:修复Java内存模型,第2部分




4
DispatchQueue.main.async和DispatchQueue.main.sync之间的区别
我已经使用DispatchQueue.main.async了很长时间来执行与UI相关的操作。 Swift同时提供DispatchQueue.main.async和DispatchQueue.main.sync,并且两者都在主队列上执行。 谁能告诉我他们之间的区别?我什么时候应该使用每个? DispatchQueue.main.async { self.imageView.image = imageView self.lbltitle.text = "" } DispatchQueue.main.sync { self.imageView.image = imageView self.lbltitle.text = "" }

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.