Java 理解给定代码的代码执行路径
我是Java新手,有人能解释一下在下面给定的代码中哪个方法调用call方法吗, 还可以帮助我了解给定代码的代码执行路径:Java 理解给定代码的代码执行路径,java,java.util.concurrent,Java,Java.util.concurrent,我是Java新手,有人能解释一下在下面给定的代码中哪个方法调用call方法吗, 还可以帮助我了解给定代码的代码执行路径: import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.E
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
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;
public class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
Thread.sleep(1000);
return Thread.currentThread().getName();
}
public static void main(String args[]){
//Get ExecutorService from Executors utility class, thread pool size is 10
ExecutorService executor = Executors.newFixedThreadPool(10);
List<Future<String>> list = new ArrayList<Future<String>>();
Callable<String> callable = new MyCallable();
for(int i=0; i< 100; i++){
Future<String> future = executor.submit(callable);
list.add(future);
}
for(Future<String> fut : list){
try {
System.out.println(new Date()+ "::"+fut.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
executor.shutdown();
}
}
import java.util.ArrayList;
导入java.util.Date;
导入java.util.List;
导入java.util.concurrent.Callable;
导入java.util.concurrent.ExecutionException;
导入java.util.concurrent.ExecutorService;
导入java.util.concurrent.Executors;
导入java.util.concurrent.Future;
公共类MyCallable实现了Callable{
@凌驾
公共字符串调用()引发异常{
睡眠(1000);
返回Thread.currentThread().getName();
}
公共静态void main(字符串参数[]){
//从Executors实用程序类获取ExecutorService,线程池大小为10
ExecutorService executor=Executors.newFixedThreadPool(10);
列表=新的ArrayList();
Callable Callable=新的MyCallable();
对于(int i=0;i<100;i++){
未来=执行人提交(可调用);
增加(未来);
}
对于(未来未来:列表){
试试{
System.out.println(newdate()+“:”+fut.get());
}捕获(中断异常|执行异常e){
e、 printStackTrace();
}
}
executor.shutdown();
}
}
当执行器.sumbit(可调用)时调用code>时,异步任务将与当前线程并行启动,以调用所提供的可调用的方法的调用()。“并行”在这里是指由Executors创建的线程池的10个线程之一。newFixedThreadPool(10)代码>
然后,您当前的线程(在main()
中)继续运行,这样做了一百次(如果所有10个线程都已忙,Callable
s将排队)
要检索每个调用的结果,您必须使用submit
s提供给您的对象,使用get()
。此fut.get()
将等待相应的call()
完成,并返回调用结果。在此代码中,您使用的是执行器和线程池executor.submit(callable)
使执行者将您的可调用放入池中的一个线程中,并通过运行call()
方法启动此线程。要理解此代码,您应该阅读以下三个站点:
可调用:
线程池:
执行者:代码向包含10个线程的ExecutorService
提交Callable
100次,并捕获指示每个Callable何时运行的未来
ExecutorService executor = Executors.newFixedThreadPool(10);
List<Future<String>> list = new ArrayList<Future<String>>();
Callable<String> callable = new MyCallable();
for (int i = 0; i < 100; i++)
{
Future<String> future = executor.submit(callable);
list.add(future);
}
您是Java新手,但已经想使用thread
s了吗?如果您先了解基础知识,并在开始高级课程之前知道如何调试应用程序,这可能是最好的。谢谢您的解释
for(Future<String> fut : list)
{
try
{
System.out.println(new Date() + "::" + fut.get());
}
catch (InterruptedException | ExecutionException e)
{
e.printStackTrace();
}
}
executor.shutdown();