一、线程池
1. ExecutorService
execute(Runnable任务对象)
把任务丢到线程池
2.Executors
辅助创建线程池的工具类
newFixedThreadPool(5)
最多5个线程的线程池
newCachedThreadPool()
足够多的线程,使任务不必等待
newSingleThreadExecutor()
只有一个线程的线程池
3.例:
public class TestThreadPool {
public static void main(String[] args) {
ExecutorService pool;
pool = Executors.newFixedThreadPool(5);
//pool = Executors.newCachedThreadPool();
//pool = Executors.newSingleThreadExecutor();
for (int i = 0; i < 1000; i++) {
pool.execute(new R1(i+1));
}
}
static class R1 implements Runnable {
int id;
public R1(int id) {
this.id = id;
}
@Override
public void run() {
String n = Thread.currentThread().getName();
System.out.println(n+" - "+id);
}
}
}
二、Callable/Future
1.Callable
可以代替Runnable,提供更丰富的功能
- 有返回值
- 可以使用泛型指定返回值类型
- 可以抛出异常
2.Future
启动一项并行任务,并在未来任务结束后,获得任务的执行结果。相当于一个凭证。
Future 父类
- FutureTask 子类
3.例
public class Test5 {
public static void main(String[] args) throws Exception {
ExecutorService pool = Executors.newFixedThreadPool(5);
C1 c = new C1();
//把任务丢进线程池,并得到凭证Future)
Future<Double> future = pool.submit(c);
System.out.println("主线程执行其他运算......");
System.out.println("主线程获取任务结果");
Double d = future.get();//用凭证获取结果
System.out.println("主线程已经获取任务的结果: "+d);
}
//任务对象
static class C1 implements Callable<Double> {
@Override
public Double call() throws Exception {
System.out.println("执行耗时计算......");
Thread.sleep(3000);
double d = Math.random();
return d;
}
}
}