java - 如何在 Java 中使用 ScheduledThreadpoolExecutor 重新启动终止的线程?

标签 java multithreading threadpool

我想要一个线程池,该线程池的线程数量保持恒定。我希望所有因异常而死亡或正常终止的线程都生成它们的精确副本以维持线程数量。

我尝试了以下代码,期望它会在循环中不断打印 1-2-3-4-1-2-3-4....,但它在第一次执行后停止。

import org.junit.Test;
import java.util.Optional;
import java.util.concurrent.*;

public class Testing {
    @Test
    public void tet() {
        ScheduledExecutorService poolExecutor =
                new CustomExecutor(4);
        for (int i = 1; i <= 4; i++) {
            poolExecutor.execute(new Task(i));
        }
    }

}

class Task implements Runnable {

    int x;

    Task(int x) {
        this.x = x;
    }

    @Override
    public void run() {
        System.out.println(x);
        if (true) {
            System.out.println("throwing exception " + x);
            throw new RuntimeException();
        }
    }
}

class CustomExecutor extends ScheduledThreadPoolExecutor {

    public CustomExecutor(int corePoolSize) {
        super(corePoolSize);
    }

    @Override
    protected void afterExecute(Runnable r, Throwable t) {
        this.execute(r);
    }
}

我按照答案中的建议将代码更改为以下内容::

    public class Testing {
    @Test
    public void tet() {
        ScheduledExecutorService poolExecutor = new ScheduledThreadPoolExecutor(4);
        for (int i = 1; i <= 4; i++) {
            poolExecutor.scheduleAtFixedRate(new Task(i), 0, 1000, TimeUnit.MILLISECONDS);
        }
    }
}
class Task extends Thread {

    int x;

    Task(int x) {
        this.x = x;
    }

    @Override
    public void run() {
        System.out.println(x);
    }
}

输出不重复。我在这里做错了什么吗?

最佳答案

不需要手动重启死线程,当新任务提交时,执行器会检查是否需要创建新线程。

在这种情况下,如果您希望任务在异常后继续运行,您可以捕获并处理它。

此外,如果您只是执行任务,它只会执行一次。如果您希望持续执行并等待终止,您应该安排它们:

@Test
public void tet() {
    ScheduledExecutorService poolExecutor =
            new CustomExecutor(4);
    for (int i = 1; i <= 4; i++) {
        poolExecutor.scheduleAtFixedRate(new Task(i), 0, 1000, TimeUnit.MILLISECONDS);
    }
    try {
        poolExecutor.awaitTermination(10000, TimeUnit.MILLISECONDS);
    } catch (Exception e) {
    }
}

关于java - 如何在 Java 中使用 ScheduledThreadpoolExecutor 重新启动终止的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50113507/

相关文章:

javascript - 如何使用Thymeleaf的blur/onblur事件来调用函数?

java - 使用组合

Java 线程池

multithreading - 我可以在 perl 中重用加入的线程吗?

python线程池不等待进程结束

java - ./run_timer.sh : no such file or directory

java - ExecutorService 存放在哪里

c# - 将对象所有权传递给 WPF 应用程序中的其他线程

c# - LINQ to SQL DAL,这个线程安全吗?

Java 生产者消费者 IllegalMonitorStateException