【发布时间】:2014-10-03 13:34:28
【问题描述】:
我可以在没有 ExecutorService 的情况下使用 Callable 线程吗?我们可以在没有 ExecutorService 的情况下使用 Runnable 的实例和 Thread 的子类,并且这段代码可以正常工作。但这段代码始终如一地工作:
public class Application2 {
public static class WordLengthCallable implements Callable {
public static int count = 0;
private final int numberOfThread = count++;
public Integer call() throws InterruptedException {
int sum = 0;
for (int i = 0; i < 100000; i++) {
sum += i;
}
System.out.println(numberOfThread);
return numberOfThread;
}
}
public static void main(String[] args) throws InterruptedException {
WordLengthCallable wordLengthCallable1 = new WordLengthCallable();
WordLengthCallable wordLengthCallable2 = new WordLengthCallable();
WordLengthCallable wordLengthCallable3 = new WordLengthCallable();
WordLengthCallable wordLengthCallable4 = new WordLengthCallable();
wordLengthCallable1.call();
wordLengthCallable2.call();
wordLengthCallable3.call();
wordLengthCallable4.call();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.exit(0);
}
}
使用 ExecutorService,代码可以使用很少的线程。我的错误在哪里?
【问题讨论】:
-
为什么要直接调用
call()方法呢?那如何创建一个后台线程?这就像直接调用 Runnable 对象的run()方法,而不是将其放入 Thread 并在 Thread 上调用start()。为什么你不想使用 ExecutorService? -
您看到了什么行为,与您的预期有何不同?
-
Class Thread 没有 Collable 的构造函数!!!为了我的利益,我提出了问题......
-
但要直接回答您的直接问题,据我所知,不,您不能在不使用 ExecutorService 的情况下使用 Callable 创建后台线程。
-
@HovercraftFullOfEels 见 Holger 的回答,他有使用 start() 的解决方案,这显然是我认为的 OP 的意思;这不会创建一个 bg 任务吗?
标签: java multithreading concurrency executorservice java.util.concurrent