gpt4 book ai didi

java - Java中的ScheduledExecutorService和线程

转载 作者:行者123 更新时间:2023-12-02 05:34:53 26 4
gpt4 key购买 nike

调度程序在这里如何工作?它是否在后台创建新线程并像回调一样在主线程中执行Run方法。 ? 。当run方法被执行时,它是否属于主线程?

 classA implements Runnable
{

public void Run()
{
System.out.println(Thread.currentTread().getName());
}

public static void main(String args[])
{
Thread.currentThread().setName("Main");

ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(this, 250, 250, TimeUnit.MILLISECONDS);

}
}
谢谢。

最佳答案

SingleThreadScheduledExecutor如何工作?

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

是否可以使该方法在“主线程”上运行?*

好吧,你可以“制造”任何东西,对吧?但不是与ExecutorService一起使用的,它旨在与自己的线程一起工作。

那怎么办?

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

这项工作涉及什么?

无需任何特殊工作,您的主线程执行的代码是不容置疑的状态。它们只编写一次,没有人可以将代码“注入(inject)”到您的主线程中(嗯,除非您对内存的了解非常困惑,可以这样做,但这不是通常的做法)。

因此,您的主线程忙于尽可能快地(或被允许)依次执行任务A,然后是B,然后是C,然后是D。您不能在此流程的中间插入“任务E”。

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

因此,即使任务A是“创建要在4秒内执行的任务”,也会发生以下情况:在另一个线程中,您会在4秒内收到计时器已过期的通知,而另一个线程将决定执行该操作,因为主线程处于执行“任务B”的中间,所以它无能为力。

因此,基本上...无法完成?

哦,是的,可以。但是您必须使“任务A”(或B或C)专用于其工作。您必须设计您的主线程来定期“等待”来自外部的事件。
而且没有很多方法可以做到:定期执行某项操作。您必须使主线程执行“循环”。这种模式称为运行循环。许多UI框架都以这种方式运行。

发生的事情是:

  • 您将创建一个队列,并使该队列可在程序中全局访问(例如,Singleton模式)。该队列的目标是接收主线程应该执行的所有工作单元。
  • 在启动时,您使主线程产生了一个辅助线程,它将负责在步骤3之后继续进行初始化过程和应用程序的生命。
  • 您使主线程进入无限循环,等待队列
  • 中的新事件

    然后,通过“辅助”线程,您可以做任何您想做的事情,包括设置您的第一个计时器。当计时器触发时,计时器应将要执行的工作(例如Runnable实例?)发送到队列。主线程将接听运行可运行内联的代码。

    高效吗?等待事件?

    是的,可以。如果使用专为并发设计的目的明确的对象( ConcurrentQueue?),则实际上不会执行工作并在等待时浪费资源。在幕后发生的事情是,线程被操作系统“标记”为新单元可用。因此,这不是一个无限循环,您在其中说“有事情要做吗?如果是,请这样做,如果不是,请等待三秒钟”。这是“有事可做时通知我”。

    我不知道要实际实现此操作的任何JAR/lib或工具或最佳实践。大多数时候,要么环境提供了此功能(Swing的 ìnvokeLater),要么我不需要这种东西。因此,我知道这在理论上是如何工作的,但是我想这实际上很难正确地实现。

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

    关于java - Java中的ScheduledExecutorService和线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25075213/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com