- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在阅读了 Dispatcher
类的文档后,我意识到它也可以用于非 UI 的操作队列。
那么 Dispatcher
类实际上是如何工作的呢?我知道,它的主要工作是将操作排队到特定线程 - 但它如何将这些操作“发送”到线程?线程如何“获取”这些操作?
我最好的猜测是每个线程都有某种“线程队列”,但我还是不知道。
最佳答案
让一个线程开始在另一个线程上执行代码并非易事。问题的症结在于,您不能简单地告诉任何线程在该线程已经启动后开始执行该方法。必须专门设置目标线程才能提前接收此类请求。
通常使用的模式是生产者-消费者。目标线程将围绕一个无限循环旋转,等待消息出现在阻塞队列中。队列被设计为阻塞直到队列中出现一个项目,从而防止目标线程不必要地消耗 CPU 时间。这是让线程接受委托(delegate)注入(inject)执行的一种非常简单的方法。
public class Example
{
private BlockingCollection<Action> queue = new BlockingCollection<Action>();
public Example()
{
new Thread(
() =>
{
while (true)
{
Action action = queue.Take();
action();
}
}).Start();
}
public void ExecuteAsync(Action action)
{
queue.Add(action);
}
}
现在,对于 UI 线程,它已经运行了一个消息循环,因此 Dispatcher
类可以简单地将一条特殊消息发布到包含要执行的委托(delegate)的消息队列中。在处理所有绘制、按钮点击等过程中,此特殊消息也会被 UI 线程拾取并开始执行委托(delegate)。
So how does the Dispatcher class actually works? I'm aware of that, it's main job is to queue actions to a specific thread - but how does it "send" those actions to the thread?
通过将委托(delegate)排队到目标线程监控的队列中。
And how do the thread "get" these actions?
通过运行一个无限循环来监控队列。队列通常是一种称为阻塞队列的特殊类型,如果队列为空,它会阻塞消费线程。
My best guess is that there's some kind of "thread queue" for each thread, but then again I've got no idea.
非常接近。除了线程实际上没有为此目的的内置队列。它必须手动设置。这就是为什么只有专门设计的线程才能接受委托(delegate)注入(inject)。 UI 线程是这样设置的,因为 Application.Run
创建了消息循环。在我的示例中,您将看到我必须使用 BlockingCollection
和无限循环才能使其在工作线程上工作。
关于c# - 调度员 - 它是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8561986/
我一直在阅读文档,但我不太清楚是否只有一个 Dispatcher 与每个 actor 关联,或者是否只有一个。假设我有 Actor SendSmsActor 和 Actor UpdateSmsActo
我有一个如下的用例: 假设我有一个 enumType Foo (可能的值 A、B、C)。假设我有 Class Bar{ List foos; // list of Foo objects where
在阅读了 Dispatcher 类的文档后,我意识到它也可以用于非 UI 的操作队列。 那么 Dispatcher 类实际上是如何工作的呢?我知道,它的主要工作是将操作排队到特定线程 - 但它如何将这
我知道我可以为授权用户通过 调用的页面激活缓存 /allowAuthorized "1" 在 /cache 部分。 但是,如果一个页面被缓存,它将被传递给所有调用它的人,甚至是匿名用户。我能否以某种方
我正在尝试使用标准的 scala.actors 包为 Scala 设计一个调度员- worker 角色模式。 调度员从 java.util.concurrent.LinkedBlockingQueue
我是一名优秀的程序员,十分优秀!