2012-01-04 50 views
0

之一在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")); 

在試驗方法中,我會如果檢查動作&如果其添加,執行某些活動,它的更新,執行其他活動....

此外,從另一個第三個動作類,我可以通過傳遞另一個動作,稱爲「更新」,調用上述相同的線程?

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); 
        } 
    } 

謝謝!

回答

1

否 - Runnable.run不接受任何參數,那麼您如何期待「刪除」部分提供給您?

只需使用第一種形式 - 創建Runnable實例與所有它需要知道的信息,以便它可以完成其工作。或者,我可能會創建Runnable的三個不同實現 - 一個用於添加,一個用於刪除,另一個用於更新。如果你想做三件事情之一,那麼爲什麼在可以使用多態時在開始執行數據?

+0

在myTask構造函數中,我將介紹這個參數,它們是不同的動作。然後在Run方法中,我將檢查動作是否添加,然後執行添加,否則執行其他操作....我可以這樣做嗎? – Mike 2012-01-04 06:34:45

+0

@Mike你可以按照你的方式去做,儘管Jon的更多OOP。如果你這樣做,至少考慮使用枚舉來進行操作(添加,刪除等)而不是字符串。 – user949300 2012-01-04 06:40:18

+0

這就是多態性。有一個UpdateTask,一個DeleteTask和一個AddTask,它們都實現了Runnable。然後你只需要做一個'myservice.execute(new AddTask(user))' – Yuushi 2012-01-04 06:41:43

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)); 
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); 
    } 
});