调度程序如何在这里工作?它是否在后台创建一个新线程并在主线程中执行Run方法,如回调。 ? 。当run方法被执行时,它是否属于主线程?
classA implements Runnable
{
public void Run()
{
System.out.println(Thread.currentTread().getName());
}
public static void main(String args[])
{
Thread.currentTread().setName("Main");
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(this, 250, 250, TimeUnit.MILLISECONDS);
}
}
感谢。
答案 0 :(得分:1)
SingleThreadScheduledExecutor如何运作?
它创建一个最多包含一个线程的线程池。这样可以确保一次只能运行一个任务(在此执行程序上安排) 任务在执行程序的单个线程中运行,而不是在已提交它们的线程上运行。
你可以做到这样,方法在"主线程"上运行?* 强>
你可以"制造"什么,对吗?但不是使用ExecutorService,它可以用于自己的线程。
怎么回事?
基本上,要么您处于为您提供一切的环境中(例如,Swing中的UI应用程序),请检查这是否是您的情况(Swing具有事件调度线程)。要么你需要一些工作。因此,我首先建议您确保在继续执行此工作之前确实需要在主线程中工作。
这项工作涉及什么?
没有任何特殊工作,您的主线程执行的代码是不间断的声明流。他们写了一次,没有人可以"注入"代码进入你的主线程(好吧,除非你的内存真的很乱,你可以,但这不是通常做的事情。)
所以你的主线程正在忙着做任务A,然后是B,然后是C,然后按顺序D,尽可能快(或被允许)。你无法注入任务E"在这个流程的中间。
隐喻,这相当于在代码中选择一个随机行,并在那里添加另一个方法的语句:崩溃保证(什么是上下文,什么是堆栈,这个特定行存在哪些变量,以及用哪个值:不可预测的)。这不可能发生。
所以,即使任务A是"创建一个要在4秒内执行的任务",会发生什么:在另一个线程中,您会在4秒内收到计时器到期的通知,以及另一个线程我们将决定做什么,因为主要线程正在做任务B"并且没有其他任何事情可以做。
所以基本上......它无法完成?
哦,是的,它可以。但你必须做出任务A" (或B或C),特别适合它工作。你必须定期设计你的主线程"等待"对于来自外部的事件。
并且没有很多方法可以做到这一点:定期做一些事情。你必须让你的主线程表现为"循环"。此模式称为运行循环。许多UI框架以这种方式运行。
会发生什么:
使用" secondary"线程,然后你可以做任何你喜欢的事情,包括设置你的第一个计时器。当计时器触发时,它应该将要执行的工作(比如一个Runnable实例?)发送到队列。主线程将选择运行runnable inline。
效率这么高吗?等待活动?
是的,它可以。如果您使用专为并发而设计的用途良好的对象(ConcurrentQueue
?),则在等待时实际上不会执行工作并浪费资源。引擎盖下发生的事情是线程已经发出信号"通过操作系统可以获得新单元。所以它不是一个无限循环,你说"有什么事可做吗?如果是>这样做,如果没有>等三秒钟#34;当有事情要做时,请发出信号"。
我不知道任何JAR / lib或工具或最佳实践来实际实现它。大多数时候,要么环境提供这个(Swing' s ìnvokeLater
),要么我不需要这样的东西。所以我知道这个理论是如何工作的,但我想这实际上是非常难以实现的。
维基百科此模式的条目:http://en.wikipedia.org/wiki/Event_loop。
在游戏编程中,通常会有一个游戏循环"这是一个等效的模式