Java 具有不同操作的Executer线程
Struts2中的操作之一是使用以下代码:Java 具有不同操作的Executer线程,java,concurrency,Java,Concurrency,Struts2中的操作之一是使用以下代码: java.util.concurrent.ExecutorService myservice = Executors.newSingleThreadExecutor(); myservice.execute(new myTask(user, "add")); 这里,myTask是实现可运行接口的内部类 我是否可以通过传递如下所示的参数a从其他action类调用上述代码: java.util.concurrent.ExecutorService mys
java.util.concurrent.ExecutorService myservice = Executors.newSingleThreadExecutor();
myservice.execute(new myTask(user, "add"));
这里,myTask是实现可运行接口的内部类
我是否可以通过传递如下所示的参数a从其他action类调用上述代码:
java.util.concurrent.ExecutorService myservice = Executors.newSingleThreadExecutor();
myservice.execute(new myTask(user, "delete"));
在Run方法中,我将检查操作&如果它是add,则执行一些活动,如果它是update,则执行其他活动
另外,从另一个第三个action类,我可以通过传递另一个action(比如“update”)来调用上面相同的线程吗
谢谢 No-
Runnable.run
不接受任何参数,那么您希望如何向您提供“删除”部分
只需使用第一个表单-创建
Runnable
实例,其中包含它需要知道的所有信息,以便它能够完成工作。或者,我可能会创建三种不同的Runnable
——一种用于添加,一种用于删除,另一种用于更新。如果您想做三件事中的一件,为什么在可以使用多态性的情况下在执行时打开数据?如果您有许多不同的操作,您可以这样做。没有多少Java开发人员知道枚举可以以这种方式使用,因此可能会造成混淆。因此,您应该少用它,但当它有意义时,它会非常方便:)
一种更简单的方法是使用匿名类
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);
}
});
在myTask构造函数中,我将使用这个参数,它是不同的操作。然后在Run方法中,我将检查操作是否为add,然后执行加法,或者执行其他操作……我可以这样做吗?@Mike您可以按自己的方式执行,尽管Jon的操作更为面向对象。如果你按照你的方式,至少考虑使用一个枚举来操作(添加,删除等等),而不是字符串。这是多态性的原因。有一个UpdateTask、一个DeleteTask和一个AddTask,它们都实现Runnable。然后你只需要做一个
myservice.execute(newaddtask(user))
Yuushi,如果我添加3个内部类UpdateTask、deletetetak和AddTask,它们将实现runnable接口,那么我必须通过run方法为所有这些类提供实现&然后,我必须使用不同的变量调用它们,比如myservice.execute(new AddTask(user));类似于myservice.execute(new updateTask(user));…当我可以编写可重用代码时,这不是不必要地增加了很多代码吗???@Mike:它以什么方式增加了代码量?可重用代码在哪里这里的代码?如果这些任务确实都有一些共同点,那么将这些共同点放入一个抽象基类中。与使用单独的类相比,基于编译时已知的字符串值来决定要做什么是难看的。
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));
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);
}
});