Tag: 并发

如何使用CancellationToken属性?

与前面的RulyCanceler类相比 ,我想用CancellationTokenSource来运行代码。 如何在取消令牌中使用它,即不抛出/捕获exception? 我可以使用IsCancellationRequested属性吗? 我试图像这样使用它: cancelToken.ThrowIfCancellationRequested(); 和 try { new Thread(() => Work(cancelSource.Token)).Start(); } catch (OperationCanceledException) { Console.WriteLine("Canceled!"); } 但是这给了cancelToken.ThrowIfCancellationRequested();的运行时错误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, Object state, […]

ArrayList的ConcurrentModificationException

我有以下一段代码: private String toString(List<DrugStrength> aDrugStrengthList) { StringBuilder str = new StringBuilder(); for (DrugStrength aDrugStrength : aDrugStrengthList) { if (!aDrugStrength.isValidDrugDescription()) { aDrugStrengthList.remove(aDrugStrength); } } str.append(aDrugStrengthList); if (str.indexOf("]") != -1) { str.insert(str.lastIndexOf("]"), "\n " ); } return str.toString(); } 当我尝试运行它,我得到ConcurrentModificationException ,任何人都可以解释为什么会发生,即使代码运行在同一个线程? 我怎么能避免它?

为什么java 5+中的volatile不能确保其他线程的可见性?

根据: http://www.ibm.com/developerworks/library/j-jtp03304/ 在新的内存模型下,当线程A写入一个易失性variablesV,并且线程B从V读取时,在写入V时A可见的任何variables值现在保证对B可见 在互联网上的许多地方声明下面的代码不应该打印“错误”: public class Test { volatile static private int a; static private int b; public static void main(String [] args) throws Exception { for (int i = 0; i < 100; i++) { new Thread() { @Override public void run() { int tt = b; // makes the jvm cache the value […]

在使用ConcurrentMap的putIfAbsent之前,你应该检查map是否包含key

我一直在使用Java的ConcurrentMap来处理可以从多个线程使用的地图。 putIfAbsent是一个很好的方法,比使用标准的映射操作更容易读写。 我有一些看起来像这样的代码: ConcurrentMap<String, Set<X>> map = new ConcurrentHashMap<String, Set<X>>(); // … map.putIfAbsent(name, new HashSet<X>()); map.get(name).add(Y); 可读性明智,但它确实需要每次创build一个新的HashSet,即使它已经在地图中。 我可以写这个: if (!map.containsKey(name)) { map.putIfAbsent(name, new HashSet<X>()); } map.get(name).add(Y); 有了这个改变,它会失去一些可读性,但不需要每次都创buildHashSet。 在这种情况下哪个更好? 我倾向于第一个方面,因为它更可读。 第二个performance会更好,可能会更正确。 也许有比这两个更好的方法来做到这一点。 以这种方式使用putIfAbsent的最佳做法是什么?

在C#中是一个bool读/写primefaces

在C#中访问布尔字段primefaces? 特别是,我需要locking: class Foo { private bool _bar; //… in some function on any thread (or many threads) _bar = true; //… same for a read if (_bar) { … } }

GCD中的并发与串行队列

我正在努力完全理解GCD中的并发和串行队列。 我有一些问题,希望有人能够清楚地回答我的问题。 我正在读取串行队列被创build和使用,以便一个接一个地执行任务。 但是,如果发生以下情况: 我创build一个串行队列 我使用dispatch_async (在我刚创build的串行队列上)三次分派三个块A,B,C 这三个块是否会被执行: 按顺序A,B,C,因为队列是串行的 要么 同时(在parralel线程同时),因为我使用ASYNC调度 我读到我可以在并发队列上使用dispatch_sync来一个接一个地执行块。 在这种情况下,为什么串行队列甚至存在,因为我总是可以使用一个并发队列,在那里我可以同步调度尽可能多的块? 感谢您的任何好解释!

Java的哪个Actor模型库/框架?

Java(和JVM语言)有很多不同的Actor模型实现。 许多Actor库和框架已经被实现来允许Java中的Actor风格的编程(它没有内build的Actor)。 我认为Actor模型有很大的优势,但是对Java的select是压倒性的! 有人可以发布最stream行的,并提供一些洞察到哪些使用? 对于每秒通过消息的吞吐量,哪些是基准的?

并发性,并行性和asynchronous方法之间有什么区别?

并发性是在单独的线程上并行运行两个任务。 但是,asynchronous方法并行运行,但在同一个线程上运行。 这是如何实现的? 另外,并行呢? 这三个概念有什么区别?

演员模型:为什么是erlang特别的? 或者,为什么你需要另一种语言呢?

我一直在研究学习erlang,因此,一直在阅读(好吧,略读)演员模型。 根据我的理解,actor模型只是一组函数(在erlang中称为“processes”的轻量级线程中运行),它们之间只能通过消息传递进行通信。 在C ++或其他语言中,这似乎相当简单: class BaseActor { std::queue<BaseMessage*> messages; CriticalSection messagecs; BaseMessage* Pop(); public: void Push(BaseMessage* message) { auto scopedlock = messagecs.AquireScopedLock(); messagecs.push(message); } virtual void ActorFn() = 0; virtual ~BaseActor() {} = 0; } 每个进程都是派生的BaseActor的一个实例。 参与者之间只能通过消息传递进行交stream。 (即推)。 行动者注册自己的初始化中央地图,允许其他行为者find他们,并允许中央function贯穿其中。 现在,我明白我错过了,或者更确切地说,在这里重要的一个问题,即:缺乏屈服意味着单个演员可以不公平地消耗过多的时间。 但是跨平台的协程是使C ++变得困难的主要原因吗? (例如Windows有光纤。) 还有什么我失踪,或者是模型真的这是显而易见的? 我绝对不是试图在这里开始一场激烈的战争,我只是想明白我错过了什么,因为这基本上是我已经做了一些有关并发代码的原因。

如何中断阻塞在take()上的BlockingQueue?

我有一个类从BlockingQueue中获取对象,并通过连续循环调用take()来处理它们。 在某些时候,我知道没有更多的对象会被添加到队列中。 如何中断take()方法,使其停止拦截? 以下是处理对象的类: public class MyObjHandler implements Runnable { private final BlockingQueue<MyObj> queue; public class MyObjHandler(BlockingQueue queue) { this.queue = queue; } public void run() { try { while (true) { MyObj obj = queue.take(); // process obj here // … } } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } 这里是使用这个类来处理对象的方法: public void […]