Tag: multithreading

如果没有人调用interrupt(),可以忽略InterruptedException吗?

如果我创build自己的线程(即不是线程池)和某处我调用sleep或任何其他可中断的方法,可以忽略InterruptedException, 如果我知道代码中没有其他人正在线程上执行中断 。 换句话说,如果线程应该和JVM一样长,意味着线程不可中断,那么假设InterruptedException 永远不会被调用,因此可以吞噬exception呢?

C#multithreading:获取读锁必要?

在从多个线程读取variables之前是否需要获取variables的locking?

为什么我应该使用线程与使用进程?

把一个程序的不同部分分成不同的进程似乎(比方说)要制作一个更优雅的程序,而不仅仅是对所有东西进行线程化。 在什么情况下,让事情在一个线程上运行,而将程序分离到不同的进程中呢? 我应该什么时候使用线程? 编辑 任何关于如何(或者如果)他们在单核和多核上采取不同的行为也是有帮助的。

等待在sun.misc.Unsafe.park(本地方法)

我的应用程序之一挂在负载下运行的一段时间,有没有人知道什么可能导致这样的输出在jstack中: "scheduler-5" prio=10 tid=0x00007f49481d0000 nid=0x2061 waiting on condition [0x00007f494e8d0000] java.lang.Thread.State: WAITING (parking) at sun.misc.Unsafe.park(Native Method) – parking to wait for <0x00000006ee117310> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1085) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:807) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1043) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1103) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) at java.lang.Thread.run(Thread.java:722) 挂起时,我在jstack输出中看到了很多。 我大量使用Spring @Async&maps,同步映射&ehcache。 有趣的是,这只发生在一个应用程序实例。 另外两个人跑得很好。 还有什么我可以调查,以获得更多的细节在这种情况下? 我发现这个posthttps://stackoverflow.com/questions/23992787/parking-to-wait-for-0xd8cf0070-a-java-util-concurrent-locks-abstractqueueds,但它不是非常有用的在我的情况。

什么multithreading包Lua“只是工作”出货?

在Lua编码,我有一个三重嵌套的循环,经历了6000次迭代。 所有的6000次迭代都是独立的,并且可以很容易地被并行化。 哪些线程包Lua 编译出来,并获得体面的并行加速四个或更多的核心? 以下是我所知道的: luaproc来自核心Lua团队,但luaforge上的软件包已经陈旧了,邮件列表中有报告。 另外,对于我来说,如何使用标量消息传递模型最终将结果导入到父线程中并不明显。 Lua Lanes提出有趣的说法,但似乎是一个重量级的,复杂的解决scheme。 邮件列表上的许多消息报告让Lua Lanes构build或为其工作带来麻烦。 我自己也难以得到潜在的“Lua岩石”分配机制为我工作。 LuaThread需要显式locking,并要求线程之间的通信由受锁保护的全局variables调解。 我可以想象得更糟,但我会更高兴地抽象。 并发Lua提供了一个类似于Erlang的有吸引力的消息传递模型,但它表示进程不共享内存。 目前还不清楚spawn实际上是否适用于任何 Lua函数或是否有限制。 Russ Cox提出了一个偶尔的只适用于C线程的线程模型。 对我没有用处。 我将upvote所有报告的实际经验与这些或任何其他multithreading包,或任何答案,提供新的信息。 作为参考,这里是我想并行化的循环: for tid, tests in pairs(tests) do local results = { } matrix[tid] = results for i, test in pairs(tests) do if test.valid then results[i] = { } local results = results[i] for sid, […]

用于处理列表的C#asynchronous选项

我想更好地理解我在C#中使用的asynchronous和并行选项。 在下面的片段中,我列出了我遇到的最多的5种方法。 但是我不确定要select哪一个,或者更好,在select时要考虑什么标准: 方法1:任务 (请参阅http://msdn.microsoft.com/en-us/library/dd321439.aspx ) 调用StartNew在function上等价于使用其中一个构造函数创build一个Task,然后调用Start来计划执行。 但是,除非创build和调度必须分开,否则S​​tartNew是简单性和性能的推荐方法。 TaskFactory的StartNew方法应该是创build和调度计算任务的首选机制,但是对于必须将创build和调度分离的情况,可以使用构造函数,然后可以使用任务的Start方法将任务调度为稍后执行时间。 // using System.Threading.Tasks.Task.Factory void Do_1() { var _List = GetList(); _List.ForEach(i => Task.Factory.StartNew(_ => { DoSomething(i); })); } 方法2:QueueUserWorkItem (请参阅http://msdn.microsoft.com/en-us/library/system.threading.threadpool.getmaxthreads.aspx ) 您可以按照系统内存允许的方式排队多个线程池请求。 如果有比线程池线程更多的请求,则附加请求保持排队,直到线程池线程可用。 您可以将排队方法所需的数据放入定义方法的类的实例字段中,也可以使用接受包含必要数据的对象的QueueUserWorkItem(WaitCallback,Object)重载。 // using System.Threading.ThreadPool void Do_2() { var _List = GetList(); var _Action = new WaitCallback((o) => { DoSomething(o); }); _List.ForEach(x => ThreadPool.QueueUserWorkItem(_Action)); […]

是variables赋值和读取primefaces操作吗?

我无法在文件中find任何提及… 是分配给一个双重(或任何其他简单的types,包括布尔值)从线程的angular度来看一个primefaces操作? double value = 0; public void First() { while(true) { value = (new Random()).NextDouble(); } } public void Second() { while(true) { Console.WriteLine(value); } } 在这个代码示例中,第一个方法在一个线程中调用,第二个方法在另一个线程中调用。 如果第二个方法在赋值给另一个线程中的variables的时候得到了执行的结果,那么第二个方法会得到一个乱码值吗 我不在乎是否收到旧的值,只有接收到一个有效的值才是重要的(不是8个字节中有2个是设置的)。 我知道这是一个愚蠢的问题,但我想确定,因为我不知道CLR如何设置variables。

最终的关键字在并发性方面保证了什么?

我想我已经读了一个字段的最后一个关键字保证,如果线程1实例化包含该字段的对象,则线程2将始终看到该字段的初始化值,如果线程2有一个对象的引用(假定它是正确构build)。 它也在JLS中表示 [线程2]也将看到任何对象或数组所引用的最终字段的最终字段是最新的版本的版本。 (JLS第17.5节) 这意味着如果我有A类 class A { private final B b = new B(); private int aNotFinal = 2; … 和B类 class B { private final int bFinal = 1; private int bNotFinal = 2; … 那么aNotFinal不能保证在线程2获得对类A的引用时被初始化,而字段bNotFinal则是,因为B是JLS中指定的最终字段引用的对象。 我有这个权利吗? 编辑: 如果我们有两个线程同时在类C的同一个实例上执行getA(),那么这种情况就可能发生 class C { private A a; public A getA(){ if (a == null){ // […]

Async WebApi Thread.CurrentCulture

我有一个自我托pipe的OWIN托pipe的Web API项目,为我提供了一些基本的REST方法。 我想要多语言的错误消息,所以我使用资源文件和一个BaseController将Thread.CurrentCulture和Thread.CurrentUICulture设置为请求的Accept-Language标头。 public override Task<HttpResponseMessage> ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken) { if (controllerContext.Request.Headers.AcceptLanguage != null && controllerContext.Request.Headers.AcceptLanguage.Count > 0) { string language = controllerContext.Request.Headers.AcceptLanguage.First().Value; var culture = CultureInfo.CreateSpecificCulture(language); Thread.CurrentThread.CurrentCulture = culture; Thread.CurrentThread.CurrentUICulture = culture; } base.ExecuteAsync(controllerContext, cancellationToken); } 这一切都很好,但问题出现,如果我使我的控制器方法asynchronous 。 当我在方法中使用await时,它可能会在另一个线程中继续,所以CurrentCulture和CurrentUICulture将会丢失。 这是我用来find这个问题的一个小例子。 public async Task<HttpResponseMessage> PostData(MyData data) { Thread currentThread = Thread.CurrentThread; await SomeThing(); if […]

Java线程转储:“等待locking”和“停车等待”之间的区别?

在Java线程转储中,您可以看到堆栈跟踪中提到的锁。 似乎有三种信息: 1: – locked <0x00002aab329f7fa0> (a java.io.BufferedInputStream) 2: – waiting to lock <0x00002aaaf4ff6fa0> (a org.alfresco.repo.lock.LockServiceImpl) 3: – parking to wait for <0x00002aaafbf70bb8> (a java.util.concurrent.SynchronousQueue$TransferStack) 1:线程已获得对象0x00002aab329f7fa0的locking。 2&3:似乎说线程正在等待所述对象的locking变为可用… 但是2和3有什么区别?