Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有不同操作的Executer线程_Java_Concurrency - Fatal编程技术网

Java 具有不同操作的Executer线程

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

Struts2中的操作之一是使用以下代码:

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