gpt4 book ai didi

java - 在java中两个独立的连续任务之间共享单个线程的最佳方法是什么

转载 作者:行者123 更新时间:2023-12-02 04:13:05 28 4
gpt4 key购买 nike

我有 2 个连续工作,名为 j1 和 j2。这两个作业没有任何共享状态。我想编写一个程序,接收未知大小的线程池并在两个作业上共享它,如果线程池大小为一,则唯一的线程可用于两个作业。在下面的代码中,j2 永远不会启动。我只是想要一个替代方案,以便在两个作业之间共享单个线程(例如循环)

    @Test
public void testConcurrency(){
final Runnable j1 = new Runnable() {
@Override
public void run() {
while (!Thread.interrupted()) {
System.out.println("a");
}
}
};
final Runnable j2 = new Runnable() {
@Override
public void run() {
while (!Thread.interrupted()) {
System.out.println("b");
}
}
};
final ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.submit(j1);
executorService.submit(j2);
executorService.shutdown();

}

我正在尝试开发一种架构,以便在所有模块中针对不同任务使用特定数量的线程池。这样我就可以控制创建的线程数量,只需将它们注入(inject)到模块中即可。我不想因为这样的代码而面临僵局。所以我想知道是否有像我提到的代码块的替代方案。我考虑过强制开发人员使用 ScheduledExecutor 而不是无限循环,我只是想知道是否缺少一些我尚未见过的东西。

最佳答案

您必须自己在任务之间进行切换。例如,您可以这样定义抽象任务:

public abstract class AbstractContinuousTask implements Runnable {

private long maxDurationInMs = 100;
private ExecutorService execService;

public AbstractContinousTask(long maxDurationInMs, ExecutorService execService) {
this.maxDurationInMs = maxDurationInMs;
this.execService = execService;
}

@Override
public final void run() {
long start = System.currentTimeMillis();
while (!Thread.interrupted() && (System.currentTimeMillis() - start < maxDurationInMs)) {
runInternal();
}
execService.submit(this);
}

public abstract void runInternal();

}

它将在给定的持续时间内调用 runInternal 方法(您可以在返回之前设置多次调用,等等...)。

然后,您的任务定义变为:

    final ExecutorService executorService = Executors.newSingleThreadExecutor();
final Runnable j1 = new AbstractContinousTask(100, executorService) {
@Override
public void runInternal() {
System.out.println("a");
}
};
final Runnable j2 = new AbstractContinousTask(100, executorService) {
@Override
public void runInternal() {
System.out.println("b");
}
};

编辑:我刚刚看到您关于开发调度架构的最后评论。您是否查看过调度库,例如 Quartz 或 Spring(带有 @Scheduled 注释)?

您也可以直接使用 java Timer api,这样:

    Timer t = new Timer();
t.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
System.out.println("a");
}
}, 0, 100);
t.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
System.out.println("b");
}
}, 0, 100);

关于java - 在java中两个独立的连续任务之间共享单个线程的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33608705/

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