线程池的好处
- 降低资源消耗。减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。
- 提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。
- 提高线程的可管理性。可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。
Runnable实现类代码:
public class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("实现Runnable方式的任务...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("任务结束");
}
}
线程池测试类:
public class Test {
public static void main(String[] args)throws Exception {
/*
线程池的使用:
1.真正的线程池接口是java.util.concurrent.ExecutorService。
2.Executors线程工具类里面提供了一些静态方法,生成一些常用的线程池
3.Executors线程工具类:
public static ExecutorService newFixedThreadPool(int nThreads):获取线程池,指定线程数量
4.ExecutorService线程池接口:
- public Future<?> submit(Runnable task):获取线程池中的某一个线程对象,并执行任务
- public <T> Future<T> submit(Callable<T> task):获取线程池中的某一个线程对象,并执行任务
Future用来封装任务执行之后返回的结果:
对于Runnable的任务,这个返回值Future就没啥用,因为run方法没有返回值
对于Callable的任务,这个返回值Future就有用,因为call方法有返回值,这个返回值就封装到了Future对象中
如何获取Future封装的返回值结果: 调用Future接口中的get方法
5.线程池的使用步骤:
1.创建线程池
2.提交任务,执行任务
3.销毁线程池(一般不操作)
*/
// 创建线程池
ExecutorService es = Executors.newFixedThreadPool(3);
// 提交任务,执行任务
MyRunnable mr1 = new MyRunnable();
MyRunnable mr2 = new MyRunnable();
MyRunnable mr3 = new MyRunnable();
MyRunnable mr4 = new MyRunnable();
MyRunnable mr5 = new MyRunnable();
es.submit(mr1);
es.submit(mr2);
es.submit(mr3);
es.submit(mr4);
Future<?> f = es.submit(mr5);
System.out.println(f.get());// null
// 销毁线程池
//es.shutdown();
}
}
Callable测试代码:
- Future submit(Callable task) : 获取线程池中的某一个线程对象,并执行.
Future : 表示计算的结果.
- V get() : 获取计算完成的结果。
public class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
System.out.println("实现Callable方式的任务");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("任务结束");
return "java";
}
}
public class Test {
public static void main(String[] args)throws Exception {
// 创建线程池
ExecutorService es = Executors.newFixedThreadPool(3);
// 提交任务,执行任务
MyCallable mc1 = new MyCallable();
MyCallable mc2 = new MyCallable();
MyCallable mc3 = new MyCallable();
MyCallable mc4 = new MyCallable();
MyCallable mc5 = new MyCallable();
es.submit(mc1);
es.submit(mc2);
es.submit(mc3);
es.submit(mc4);
Future<String> f = es.submit(mc5);
System.out.println(f.get());// java
// 销毁线程池
//es.shutdown();
}
}