bsp; 2.2、submit(Runnable)
方法 submit(Runnable) 同样接收一个 Runnable 的实现作为参数,但是会返回一个 Future 对象。这个 Future 对象可以用于判断 Runnable 是否结束执行。如下是一个 ExecutorService 的 submit() 方法的例子:
package com.app;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class ExecutorTest {
public static void main(String[] args) {
//创建一个线程数固定大小为10的线程池
ExecutorService executorService = Executors.newFixedThreadPool( 10 ) ;
//执行一个任务 该任务是 new Runnable() 对象
Future future = executorService.submit( new Runnable() {
@Override
public void run() {
Log.d( Thread.currentThread().getName() );
}
});
try {
//如果任务结束执行则返回 null
Log.d( ""+ future.get() );
} catch (Exception e) {
e.printStackTrace();
}
//关闭线程池
executorService.shutdown();
}
}
结果:
pool-1-thread-1
null
2.3 submit(Callable)
方法 submit(Callable) 和方法 submit(Runnable) 比较类似,但是区别则在于它们接收不同的参数类型。Callable 的实例与 Runnable 的实例很类似,但是 Callable 的 call() 方法可以返回壹個结果。方法 Runnable.run() 则不能返回结果。
Callable 的返回值可以从方法 submit(Callable) 返回的 Future 对象中获取。如下是一个 ExecutorService Callable 的例子:
package com.app;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class ExecutorTest {
public static void main(String[] args) {
//创建一个线程数固定大小为10的线程池
ExecutorService executorService = Executors.newFixedThreadPool( 10 ) ;
//执行一个任务 该任务是 new Callable() 对象
Future future = executorService.submit( new Callable<String>() {
@Override
public String call() throws Exception {
return "执行完了" ;
}
}) ;
try {
//如果任务结束执行则返回
Log.d( "结果是: "+ future.get() );
} catch (Exception e) {
e.printStackTrace();
}
//关闭线程池
executorService.shutdown();
}
}
结果:
结果是: 执行完了
2.4、inVokeAny()
方法 invokeAny() 接收一个包含 Callable 对象的集合作为参数。调用该方法不会返回 Future 对象,而是返回集合中某一个 Callable 对象的结果,而且无法保证调用之后返回的结果是哪一个 Callable,只知道它是这些 Callable 中一个执行结束的 Callable 对象。如果一个任务运行完毕或者抛出异常,方法会取消其它的 Callable 的执行。
package com.app;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ExecutorTest {
public static void main(String[] args) {
//创建一个线程数固定大小为10的线程池
ExecutorService executorService = Executors.newFixedThreadPool( 10 ) ;
List<Callable<String>> list = new ArrayList<>() ;
//创建第一个 Callable
Callable<String> callable1 = new Callable<String>() {
@Override
public String call() throws Exception {
Log.d( "callable 1 线程是: "+ Thread.currentThread().getName() );
return "执行完了 callable 1" ;
}
};
//创建第二个 Callable
Callable<String> callable2 = new Callable<String>() {
@Override