Java ExecutorService 任务生成

标签 java coding-style refactoring executorservice

我有一个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/

相关文章:

java - 从 Maven 设置 TestNG 的详细级别

python - PEP 8 : library specific imports?

python - 我应该在手术前还是手术后登录?

ruby - Rubocop 规则在下一行进行赋值时强制双缩进

ios - Xcode 4.3 和 4.3.1 破坏重构?

python - 在 Python 中测试 ImportErrors

java - 读取文本文件,for in while 与 while in for (java)

java - Spring原型(prototype)范围 - 用例?

java - 如何在android中获取图像的(x,y)坐标?

java - 在intellij中,如何提取添加到列表并返回列表而不是使用列表作为参数的方法?