Поток выполнения с различными действиями - PullRequest
0 голосов
/ 04 января 2012

Одним из действий в Struts2 является использование кода ниже:

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

Здесь myTask - это внутренний класс, который реализует интерфейс Runnable.

Могу ли я также вызвать приведенный выше код из другого класса действий, передав параметр a, показанный ниже:

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

В методе Run я проверю действие и, если его добавить, выполню какое-либо действие, если его обновление выполню другое действие ...

Кроме того, из другого 3-го класса действий я могу вызвать ту же самую вышеупомянутую нить, передавая другое действие, скажем «update» ???

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 ]

1 голос
/ 04 января 2012

Нет - Runnable.run не принимает никаких параметров, так как вы ожидаете, что вам будет предоставлена ​​часть "delete"?

Просто используйте первую форму - создайте экземпляр Runnable с all информацией, которую он должен знать, чтобы он мог выполнять свою работу. В качестве альтернативы, я бы, вероятно, создал три различных реализации Runnable - одну для добавления, одну для удаления и одну для обновления. Если вы хотите сделать одну из трех вещей, зачем включать данные во время выполнения, когда вы можете использовать полиморфизм?

0 голосов
/ 04 января 2012

Намного проще использовать анонимный класс.

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);
    }
});
0 голосов
/ 04 января 2012

Если у вас много разных операций, вы можете сделать что-то вроде этого.Не многие разработчики 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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...