执行程序线程具有不同的操作

时间:2012-01-04 06:26:54

标签: java concurrency

Struts2中的一个操作是使用下面的代码:

java.util.concurrent.ExecutorService myservice = Executors.newSingleThreadExecutor();
myservice.execute(new myTask(user, "add"));

这里,myTask是实现Runnable接口的内部类。

我可以通过传递如下所示的参数来调用其他动作类中的上述代码:

java.util.concurrent.ExecutorService myservice = Executors.newSingleThreadExecutor();
myservice.execute(new myTask(user, "delete"));

在Run方法中,我会检查动作&如果它的添加,执行一些活动,如果它的更新,执行其他活动....

另外,从另一个第3个动作类,我可以通过传递另一个动作调用相同的上述线程,比如“更新”???

class myTask implements Runnable{
private User user = null;

private String action = null;

myTask(User user, String action){
    this.user = user;
    this.action = action;
}

public void run(){
        if (action.equals("add")) {
                           performAdd(user);
                    } else if (action.equals("delete")) {
                           performDelete(user);
                    }
    }

谢谢!

3 个答案:

答案 0 :(得分:1)

否 - Runnable.run不接受任何参数,那么您希望如何向您提供“删除”部分?

只需使用第一个表单 - 使用 all 创建Runnable实例,使其知道需要知道的信息,以便它可以完成其工作。或者,我可能会创建Runnable的三种不同实现 - 一种用于添加,一种用于删除,一种用于更新。如果你想做三件事之一,为什么在你可以使用多态时在执行时打开数据呢?

答案 1 :(得分:0)

如果你有很多不同的操作,你可以做这样的事情。没有多少Java开发人员知道枚举可以这种方式使用,因此可能会令人困惑。因此你应该谨慎使用它,但是当它有意义时它可以非常方便:)

 enum Op {
    ADD{
        public void perform(Dao dao, User user){
            // do stuff
        }
    },
     UPDATE{
         public void perform(Dao dao, User user){
             // do stuff
         }
     },
     DELETE{
         public void perform(Dao dao, User user){
             // do stuff
         }
     };
    public abstract void perform(Dao dao);
}

class Mytask{
    // [...] 
    public void run(){
        // stuff
        this.op.perform(dao, user);
        // stuff
    }
}

input = "ADD";
service.execute(new MyTask(Op.valueOf(input), user));

答案 2 :(得分:0)

更简单的方法是使用匿名类。

ExecutorService mySservice = Executors.newSingleThreadExecutor();


final User user = 
mySservice.execute(new Runnable() { 
    public void run() {
         performAdd(user);
    }
});
// using the same myService
mySservice.execute(new Runnable() { 
    public void run() {
         performDelete(user);
    }
});