gpt4 book ai didi

Java ExecutorService 任务生成

转载 作者:行者123 更新时间:2023-11-30 04:33:07 25 4
gpt4 key购买 nike

我有一个ExecutorService,用于处理任务流。这些任务由我的 DaemonTask 类表示,每个任务都会构建一个响应对象,该对象将传递给响应调用(超出了本问题的范围)。我使用 switch 语句根据任务 ID int 生成适当的任务。它看起来像;

//in my api listening thread
executorService.submit(DaemonTask.buildTask(int taskID));
<小时/>
//daemon task class
public abstract class DaemonTask implements Runnable {

public static DaemonTask buildTask(int taskID) {
switch(taskID) {
case TASK_A_ID: return new WiggleTask();
case TASK_B_ID: return new WobbleTask();
// ...very long list ...
case TASK_ZZZ_ID: return new WaggleTask();
}
}

public void run() {
respond(execute());
}

public abstract Response execute();
}

<小时/>我的所有任务类(例如 WiggleTask() ) 扩展 DaemonTask 并提供 execute() 方法的实现。

我的问题很简单;这种模式合理吗?当我看着我巨大的 switch case 及其所有 return 语句时,感觉有些不对劲。我试图以某种方式使用反射来提出一个更优雅的查找表解决方案,但似乎无法找出可行的方法。

最佳答案

你真的需要那么多课吗?每个taskId 可以有一个方法。

final ResponseHandler handler = ... // has many methods.

// use a map or array or enum to translate transIds into method names.
final Method method = handler.getClass().getMethod(taskArray[taskID]);
executorService.submit(new Callable<Void>() {
public Void call() throws Exception {
method.invoke(handler);
}
});

如果你必须有很多类(class),你可以这样做

// use a map or array or enum to translate transIds into methods.
final Runnable runs = Class.forName(taskClassArray[taskID]).newInstance();
executorService.submit(new Callable<Void>() {
public Void call() throws Exception {
runs.run();
}
});

关于Java ExecutorService 任务生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14141467/

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