认识Executor
执行提交的Runnable任务的对象。 这个接口提供了一种将任务提交与每个任务如何运行的机制解耦的方式,包括线程使用,调度等细节。通常使用Executor而不是显式创建线程。 例如,不是为一组任务中的每一个调用新Thread(new(RunnableTask()))。start(),你可以使用:
Executor executor = anExecutor;
executor.execute(new RunnableTask1());
executor.execute(new RunnableTask2());
用法:
class DirectExecutor implements Executor {
public void execute(Runnable r) {
r.run();
}
}
方法:
void execute(Runnable command)
将来在某个时间执行给定的命令。 执行程序可以根据执行程序的执行情况,在新线程,池线程或调用线程中执行该命令。
Callable
返回结果并可能抛出异常的任务。 实现者定义了一个没有参数称为call的单一方法。
Callable接口与Runnable类似,都是为其实例可能由另一个线程执行的类设计的。 但是,Runnable不会返回结果,也不会抛出检查的异常。Executors类包含从其他常见形式转换为Callable类的实用程序方法。
V call() throws Exception
计算结果,或者如果不能这样做则抛出异常。
当线程完毕后需要返回值时使用Callable,反之使用Runable
Executors
此包中定义的Executor,ExecutorService,ScheduledExecutorService,ThreadFactory和Callable类的工厂和实用程序方法。
这个类支持以下几种方法: 创建并返回使用常用的配置设置设置的ExecutorService的方法。
创建并返回使用常用的配置设置的ScheduledExecutorService的方法。
创建并返回“包装的”ExecutorService的方法,通过使特定于实现的方法不可访问来禁用重新配置。
创建并返回将新创建的线程设置为已知状态的ThreadFactory的方法。
从其他闭包形式创建并返回一个Callable的方法,所以它们可以用在需要Callable的执行方法中。
线程池的概念
public class T05_ThreadPool {
public static void main(String[] args) throws InterruptedException {
ExecutorService service = Executors.newFixedThreadPool(5); // new一个固定容量为5的线程池
for (int i = 0; i < 6; i++) {
service.execute(()->{
try {
TimeUnit.MICROSECONDS.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
});
}
System.out.println(service);
//线程池的关闭
service.shutdown();
System.out.println(service.isTerminated());
System.out.println(service.isShutdown());
System.out.println(service);
TimeUnit.SECONDS.sleep(5);
System.out.println(service.isTerminated());
System.out.println(service.isShutdown());
System.out.println(service);
}
}
future
具有返回值
public class T06_Future {
public static void main(String[] args) throws InterruptedException, ExecutionException {
FutureTask<Integer> task = new FutureTask<>(()->{
TimeUnit.MILLISECONDS.sleep(500);
return 1000;
}) ;//相当于new Callable(){Integer call();}
new Thread(task).start();
System.out.println(task.get()); //阻塞
ExecutorService service = Executors.newFixedThreadPool(5);
Future<Integer> f = service.submit(()->{
TimeUnit.MILLISECONDS.sleep(500);
return 1;
});
System.out.println(f.get());
System.out.println(f.isDone());
}
}