Tag: multithreading

线程在GWT(客户端)

据我所知,GWT应用程序的整个客户端在构build时转换为Javascript,因此我想这个问题与Javascript和GWT提供的可能性有关。 我有几十个过程需要在我的GWT应用程序中启动,然后每个过程将不断地调用服务器。 GWT是否支持线程? GWT客户端是否支持线程? 编辑: 此链接指出: No JavaScript knowledge required If you're just a user of the framework, which I am for the matter of discussion, you do not need to know JavaScript in order to write dynamic content, be it client-side such as rolling frames, docking panels or scheduled “multi-threading” tasks, or server-side calls […]

避免在跨线程WinForm事件处理中调用/ BeginInvoke的困境?

我仍然困扰于WinForm UI中的后台线程。 为什么? 以下是一些问题: 显然最重要的问题是,我不能修改一个控制,除非我在创build它的同一个线程上执行。 如你所知,Invoke,BeginInvoke等只有在创buildControl之后才可用。 即使在RequiresInvoke返回true之后,BeginInvoke仍然可以抛出ObjectDisposed,即使它不抛出,如果控件被销毁,它也不会执行代码。 即使在RequiresInvoke返回true之后,Invoke也可以无限期地挂起,等待与Invoke调用同时处理的控件执行。 我正在寻找一个优雅的解决scheme来解决这个问题,但在进入我所寻找的细节之前,我想我会澄清这个问题。 这是为了解决一般问题,并在后面加一个更具体的例子。 对于这个例子,假设我们通过互联网传输大量的数据。 用户界面必须能够显示正在进行的传输的进度对话框。 进度对话框应该不断快速更新(每秒更新5到20次)。 用户可以随时closures进度对话框并根据需要再次调用。 而且,假设参数为假,如果对话框是可见的,它必须处理每个进度事件。 用户可以在进度对话框中点击取消,并通过修改事件参数,取消操作。 现在我需要一个解决scheme,将适合下面的一些约束: 允许工作者线程调用Control / Form上的方法,并阻止/等待,直到执行完成。 允许对话本身在初始化或类似的地方调用这个相同的方法(因此不使用调用)。 处理方法或调用事件没有实施的负担,解决scheme应该只改变事件订阅本身。 适当地处理阻塞调用到可能正在处理的对话框中。 不幸的是,这不像检查IsDisposed那么简单。 必须能够与任何事件types一起使用(假定EventHandlertypes的委托) 不得将exception转换为TargetInvocationException。 该解决scheme必须使用.Net 2.0及更高版本 那么,鉴于上面的限制,这可以解决吗? 我搜遍了无数的博客和讨论,可惜我还是空手而归。 更新:我知道这个问题没有简单的答案。 我只在这个网站上呆了几天,而且我看到一些有很多经验的人回答了问题。 我希望这些人中的一个已经足够的解决了这个问题,我不用花一个星期左右的时间来构build一个合理的解决scheme。 更新#2:好吧,我将尝试更详细地描述问题,看看有什么(如果有的话)摆脱。 下面的属性可以让我们确定它的状态有一些事情引起关注… Control.InvokeRequired =如果在当前线程上运行,或者IsHandleCreated为所有父项返回false,则logging为返回false。 InvokeRequired实现可能会抛出ObjectDisposedException,甚至可能重新创build对象的句柄,这让我很困扰。 而且,因为InvokeRequired在我们无法调用的时候(Dispose正在进行)可以返回true,即使我们可能需要使用invoke(Create in progress),它也可以返回false,所以这在任何情况下都是不可信的。 唯一的情况下,我可以看到我们可以信任的InvokeRequired返回false是当IsHandleCreated在调用之前和之后都返回true(BTW的MSDN文档为InvokeRequired提及检查IsHandleCreated)。 Control.IsHandleCreated =如果句柄已经分配给控件,则返回true; 否则,是错误的。 虽然IsHandleCreated是一个安全的调用,但如果控件正在重新创build它的句柄,它可能会崩溃。 这个潜在的问题似乎可以通过在访问IsHandleCreated和InvokeRequired时执行locking(控制)来解决。 Control.Disposing =如果控件正在处理过程中,则返回true。 Control.IsDisposed =如果控件已被处置,则返回true。 我正在考虑订阅Disposed事件,并检查IsDisposed属性来确定是否BeginInvoke将完成。 这里最大的问题是在Disposing – > […]

与Scala / Akka演员相比,Java线程怎么样?

我只是比较斯卡拉演员与Java线程的performance。 我惊异地看到了差异,我观察到,在我的系统中,我能够产生最多2000线程(一次只能生活)。但是使用同一个系统,我能够产生大约50万个scala的演员。 这两个程序都使用了大约81MB的JVM堆内存。 你能解释一下java线程是如何比scala / akka actor更重吗? 什么是使scala-actor这么重量轻的关键因素? 如果我想获得最佳的可伸缩性,我应该去基于演员的Web服务器,而不是基于Java的传统的Web /应用服务器,如JBoss或Tomcat? 谢谢。

信号量 – 初始计数有什么用?

http://msdn.microsoft.com/en-us/library/system.threading.semaphoreslim.aspx 要创build一个信号量,我需要提供一个初始计数和最大计数。 MSDN指出,最初的计数是 – 可以同时授予的信号量请求的初始数量。 虽然它说最大的数量是 可以同时授予的信号量的最大请求数。 我可以理解,最大数量是可以并发访问资源的最大线程数。 但是,什么是初始计数的使用? 如果我创build一个初始计数为0和最大计数为2的信号量,则不会有任何线程池线程能够访问资源。 如果我将初始计数设置为1,最大计数设置为2,则只有线程池线程可以访问资源。 只有当初始计数和最大计数都设置为2时,2个线程才能够同时访问资源。 那么,我真的很疑惑初始计数的意义呢? SemaphoreSlim semaphoreSlim = new SemaphoreSlim(0, 2); //all threadpool threads wait SemaphoreSlim semaphoreSlim = new SemaphoreSlim(1, 2);//only one thread has access to the resource at a time SemaphoreSlim semaphoreSlim = new SemaphoreSlim(2, 2);//two threadpool threads can access the resource concurrently

如何使方法取消而不会变得丑陋?

我目前正在改造我们长期以来可以取消的方法。 我正在计划使用System.Threading.Tasks.CancellationToken来实现。 我们的方法通常执行几个长时间运行的步骤(主要发送命令然后等待硬件),例如 void Run() { Step1(); Step2(); Step3(); } 我的第一个(也许是愚蠢的)取消想法将转化为 bool Run(CancellationToken cancellationToken) { Step1(cancellationToken); if (cancellationToken.IsCancellationRequested) return false; Step2(cancellationToken); if (cancellationToken.IsCancellationRequested) return false; Step3(cancellationToken); if (cancellationToken.IsCancellationRequested) return false; return true; } 坦率地看起来很可怕。 这个“模式”也将在单个步骤内部继续(而且它们必然已经相当长)。 这将使Thread.Abort()看起来相当性感,虽然我知道它不推荐。 有没有一个更清晰的模式来实现这一点,不隐藏在许多样板代码下面的应用程序逻辑? 编辑 作为步骤性质的一个例子, Run方法可以读取 void Run() { GiantRobotor.MoveToBase(); Oven.ThrowBaguetteTowardsBase(); GiantRobotor.CatchBaguette(); // … } 我们正在控制不同的硬件单元,需要同步才能一起工作。

WaitHandle的基本概念是什么?

C#.net线程中WaitHandle的基本概念是什么? 它的用途是什么? 何时使用它? 里面的WaitAll和WaitAny方法有什么用?

有没有使用一个易变的长期?

我偶尔使用一个volatilevariables来处理两个线程读取/写入的情况,而不希望取出锁的开销(或潜在的死锁风险)。 例如一个定时器线程定期更新一个inttypes的ID,这个ID在某些类上被作为getter使用: public class MyClass { private volatile int id; public MyClass() { ScheduledExecutorService execService = Executors.newScheduledThreadPool(1); execService.scheduleAtFixedRate(new Runnable() { public void run() { ++id; } }, 0L, 30L, TimeUnit.SECONDS); } public int getId() { return id; } } 我的问题:鉴于JLS只保证32位读取将是primefaces是有没有使用一个易变的长期的任何一点? (即64位)。 警告 :请不要回复说,使用volatile over synchronized是一种预优化的情况; 我很清楚如何/何时使用synchronized但有些情况下volatile是最好的。 例如,当定义一个在单线程应用程序中使用的Spring bean时,我倾向于支持volatilevariables,因为不能保证Spring上下文将初始化主线程中的每个bean的属性。

Java:使用Thread.interrupted()和Thread.isInterrupted()之间的区别?

Java的问题:据我所知,有两种方法来检查一个线程内部线程是否收到一个中断信号,Thread.interrupted()和Thread.isInterrupted(),它们唯一的区别是前者重置内部中断的国旗。 到目前为止,我一直使用Thread.isInterrupted(),从来没有任何问题。 再次,我见过的大多数教程推荐使用Thread.interrupted()。 有什么具体的原因吗?

无法访问dispatch_async中的全局variables:“Variable is not Assignable(missing _block type specifier)”

在我的dispach_async代码block我无法访问global variables 。 我得到这个错误Variable is not Assignable (missing _block type specifier) 。 NSString *textString; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, (unsigned long)NULL), ^(void) { textString = [self getTextString]; }); 任何人都可以帮我找出原因吗?

如何分配线程本地存储?

我在我的函数中有一个variables是静态的,但我希望它在每个线程的基础上是静态的。 我怎样才能为我的C ++类分配内存,使得每个线程都有自己的类实例副本? AnotherClass::threadSpecificAction() { // How to allocate this with thread local storage? static MyClass *instance = new MyClass(); instance->doSomething(); } 这是在Linux上。 我没有使用C ++ 0x,这是gcc v3.4.6。