Java中的ScheduledExecutorService和Threads

时间:2014-08-01 07:37:54

标签: java multithreading scheduledexecutorservice

调度程序如何在这里工作?它是否在后台创建一个新线程并在主线程中执行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);

    } 
}

感谢。

1 个答案:

答案 0 :(得分:1)

SingleThreadScheduledExecutor如何运作?

它创建一个最多包含一个线程的线程池。这样可以确保一次只能运行一个任务(在此执行程序上安排) 任务在执行程序的单个线程中运行,而不是在已提交它们的线程上运行。

你可以做到这样,方法在"主线程"上运行?*

你可以"制造"什么,对吗?但不是使用ExecutorService,它可以用于自己的线程。

怎么回事?

基本上,要么您处于为您提供一切的环境中(例如,Swing中的UI应用程序),请检查这是否是您的情况(Swing具有事件调度线程)。要么你需要一些工作。因此,我首先建议您确保在继续执行此工作之前确实需要在主线程中工作。

这项工作涉及什么?

没有任何特殊工作,您的主线程执行的代码是不间断的声明流。他们写了一次,没有人可以"注入"代码进入你的主线程(好吧,除非你的内存真的很乱,你可以,但这不是通常做的事情。)

所以你的主线程正在忙着做任务A,然后是B,然后是C,然后按顺序D,尽可能快(或被允许)。你无法注入任务E"在这个流程的中间。

隐喻,这相当于在代码中选择一个随机行,并在那里添加另一个方法的语句:崩溃保证(什么是上下文,什么是堆栈,这个特定行存在哪些变量,以及用哪个值:不可预测的)。这不可能发生。

所以,即使任务A是"创建一个要在4秒内执行的任务",会发生什么:在另一个线程中,您会在4秒内收到计时器到期的通知,以及另一个线程我们将决定做什么,因为主要线程正在做任务B"并且没有其他任何事情可以做。

所以基本上......它无法完成?

哦,是的,它可以。但你必须做出任务A" (或B或C),特别适合它工作。你必须定期设计你的主线程"等待"对于来自外部的事件。
并且没有很多方法可以做到这一点:定期做一些事情。你必须让你的主线程表现为"循环"。此模式称为运行循环。许多UI框架以这种方式运行。

会发生什么:

  1. 您创建一个队列,并使其可全局访问(例如,单例模式)到您的程序。此队列的目标是接收主线程应执行的所有工作单元。
  2. 一开始,你让主线程产生一个辅助线程,负责在第3步之后继续初始化过程和应用程序的生命。
  3. 使主线程进入无限循环,等待队列中的新事件
  4. 使用" secondary"线程,然后你可以做任何你喜欢的事情,包括设置你的第一个计时器。当计时器触发时,它应该将要执行的工作(比如一个Runnable实例?)发送到队列。主线程将选择运行runnable inline。

    效率这么高吗?等待活动?

    是的,它可以。如果您使用专为并发而设计的用途良好的对象(ConcurrentQueue?),则在等待时实际上不会执行工作并浪费资源。引擎盖下发生的事情是线程已经发出信号"通过操作系统可以获得新单元。所以它不是一个无限循环,你说"有什么事可做吗?如果是>这样做,如果没有>等三秒钟#34;当有事情要做时,请发出信号"。

    我不知道任何JAR / lib或工具或最佳实践来实际实现它。大多数时候,要么环境提供这个(Swing' s ìnvokeLater),要么我不需要这样的东西。所以我知道这个理论是如何工作的,但我想这实际上是非常难以实现的。

    维基百科此模式的条目:http://en.wikipedia.org/wiki/Event_loop
    在游戏编程中,通常会有一个游戏循环"这是一个等效的模式