我正在尝试使用ExecutorService并行运行多个服务。但我没有平行执行。
我写了 java.util.concurrent.TimeUnit.MINUTES.sleep(1)在Service1类中等待一分钟。
但Service2仅在Service1处理后才处理。
下面是我的代码片段,如果我对ExecutorService的理解错误,请更正我/代码
public void startService() {
try {
ExecutorService service = Executors.newFixedThreadPool(3);
service.submit(new Service1());
service.submit(new Service2());
service.submit(new Service3());
service.shutdown();
service.awaitTermination(1, TimeUnit.MINUTES);
System.exit(0);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public class Service1 implements Callable<Object> {
{
try {
java.util.concurrent.TimeUnit.MINUTES.sleep(1);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public Object call() throws Exception {
return null;
}
}
public class Service2 implements Callable<Object> {
@Override
public Object call() throws Exception {
System.out.println(" Service 2 "); // It prints after 1 minute only.
return null;
}
}
public class Service3 implements Callable<Object> {
@Override
public Object call() throws Exception {
System.out.println(" Service 3 ");
return null;
}
}
答案 0 :(得分:2)
代码:
{
try {
java.util.concurrent.TimeUnit.MINUTES.sleep(1);
} catch (Exception e) {
e.printStackTrace();
}
}
是一个构造函数,它在执行新的Service1()时由主线程调用。 所以是的,它必须在它有机会提交服务之前完成。
更新:
在您的原始帖子中,睡眠是在调用方法中,并且它有效。现在,您的Service1相当于:
public class Service1 implements Callable<Object> {
public Service1() {
try {
java.util.concurrent.TimeUnit.MINUTES.sleep(1);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public Object call() throws Exception {
return null;
}
}
执行程序只运行调用方法。在构造函数完成之前,甚至无法提交Service1实例。