Java基于Object的属性单独进行线程处理

时间:2013-12-02 20:48:05

标签: java multithreading interface

我有一个对象列表(MyObject)。这些对象的一个​​属性是“类型”字符串值。列表对象用于在线程池中生成线程。如何根据类型不同地处理每个对象,而不为扩展基础对象的每种类型创建新对象?

基本接口可以工作,但是要求我在每个对象类型的不同具体类中实现它们(可以有很多类型)。感觉就像有一种模式可以以干净的方式解决这个问题,但我找不到它......任何人都有任何想法?

以下是我要完成的内容:

                List<MyObject> objects = dao.getObjects();                  
                if (objects.size() > 0) {                   
                    for (MyObject obj : objects) {
                            taskExecutor.submit(???);


                    }   
                }

2 个答案:

答案 0 :(得分:1)

  

这些对象的一个​​属性是“类型”字符串值

这是您的错误 - 为您的类型使用enum并将其用作工厂进行处理。

class MyObject {

  Type type;
}

enum Type {

  TypeA {
            @Override
            void process(MyObject o) {
              // Stuff.
            }
          },
  TypeB {
            @Override
            void process(MyObject o) {
              // Stuff.
            }
          };

  abstract void process(MyObject o);

}

public void test(MyObject o) {
  o.type.process(o);
}

答案 1 :(得分:0)

我可能会犯这个错误(抱歉,如果我这样做了!),但不能是一个简单的地图:

Map<String, Function<YourObject, Callable<V>>> typeToTask = new HashMap<>();

做这个工作?因此,根据每种对象类型,您只需提供一个提交给线程池的闭包(任务)工厂。 Function可能是

interface Function<I, O>{
     O apply(I object);
}

如何添加处理作业:

typeToTask.put("objectType1", new Function<YourObject, Callable<V>>(){
     public Callable<V> apply(YourObject yourObject){
          return new Callable<V> () {
              ... do the job for yourObject of type "objectType1" ...
          }
     }
});

然后你可以迭代列表并提交这样的工作:

for(YourObject yourObject : objects){
    executor.submit(typeToTask.get(yourObject.type).apply(yourObject));
}