import
java.util.ArrayList;
import
java.util.concurrent.Callable;
import
java.util.concurrent.ExecutionException;
import
java.util.concurrent.ExecutorService;
import
java.util.concurrent.Executors;
import
java.util.concurrent.Future;
import
java.util.concurrent.TimeUnit;
class
TaskWithResult
implements
Callable<String>{
private
int
id;
private
static
int
count =
10
;
private
final
int
time =count--;
public
TaskWithResult(
int
id){
this
.id = id;
}
@Override
public
String call()
throws
Exception {
TimeUnit.MILLISECONDS.sleep(
100
);
return
"Result of TaskWithResult : "
+ id+
", Time= "
+time;
}
}
public
class
CallableDemo {
public
static
void
main(String[] args)
throws
InterruptedException, ExecutionException {
ExecutorService exec = Executors.newCachedThreadPool();
ArrayList<Future<String>> results =
new
ArrayList<Future<String>>();
for
(
int
i=
0
;i<
10
;i++){
results.add(exec.submit(
new
TaskWithResult(i)));
}
for
(Future<String> fs : results){
System.out.println(fs.get());
}
}
}
经测试表面,call()方法的执行应是在exec.submit的时候调用的。也及时在线程被执行的时候执行call方法里面的东西。但这里有个问题如果启了多个线程,给call方法上打了断点,测试结果并不是每个线程执行的时候断点都会走call方法,应该是内部也有线程进行维护。我的理解就到这,希望懂的大神再帮忙解释下。