每次我调用 runnable run() 时都会创建一个线程吗?

Gir*_*ful 1 java

我写了一个类,我使用如下:

EventWrapperBuilder.newWrapperBuilder().
            addSync(this::<some_method>).
            addSync(this::<some_method>).
            addSync(this::<some_method>).
            addAsync(() -> <some_method>, Duration.ofSeconds(10)).
            GET();
Run Code Online (Sandbox Code Playgroud)

我的代码如下:

private final List<EventWrapper> _wrappers = new ArrayList<>();

    public EventWrapperBuilder addSync(final Runnable task)
    {
        _wrappers.add(new EventWrapper(task, Duration.ZERO));
        return this;
    }

    public EventWrapperBuilder addAsync(final Runnable task, final Duration duration)
    {
        _wrappers.add(new EventWrapper(task, duration));
        return this;
    }

    /**
     * @return {@code List} of all {@code Future}
     */
    public List<Future<?>> GET()
    {
        final List<Future<?>> list = new ArrayList<>();

        for (final EventWrapper wrapper : getWrappers())
        {
            if (!wrapper.getDuration().isZero())
            {
                list.add(ThreadPoolManager.getInstance().scheduleEvent(wrapper.getTask(), wrapper.getDuration().toMillis()));
            }
            else
            {
                wrapper.getTask().run();
            }
        }

        return list;
    }

    /**
     * @param builder
     * @return {@code EventWrapperBuilder}
     */
    public EventWrapperBuilder COMBINE(final EventWrapperBuilder builder)
    {
        _wrappers.addAll(builder.getWrappers());
        return this;
    }

    /**
     * @return {@code List} of all {@code EventWrapper}
     */
    public List<EventWrapper> getWrappers()
    {
        return _wrappers;
    }

    //@formatter:off
    private static record EventWrapper (Runnable getTask, Duration getDuration) {}
    //@formatter:on

    public static EventWrapperBuilder newWrapperBuilder()
    {
        return new EventWrapperBuilder();
    }
Run Code Online (Sandbox Code Playgroud)

EventWrappers我的问题是:如果它是即时的,即持续时间为零,我每次执行此操作时是否都会创建一个新线程?

我显然知道

list.add(ThreadPoolManager.getInstance().scheduleEvent(wrapper.getTask(), wrapper.getDuration().toMillis()));
Run Code Online (Sandbox Code Playgroud)

创建一个线程并在预定时间后执行它,但是

wrapper.getTask().run();
Run Code Online (Sandbox Code Playgroud)

没有线程是实时的吗?我不希望我的代码创建线程,因此在执行时会很重run()

Tom*_*ias 5

不,调用run()Runnable 接口不会产生新线程。另一方面,当您使用 Thread 类包装 Runnable 并调用时start(),JVM 将生成一个新线程并在其上下文中执行 Runnable。

在您的代码中,只有异步任务会在单独的线程中运行,因为线程池正在管理它们的执行。