-java程序在创建和启动一个新的线程时需要的成本比较高,它涉及到了
和操作系统进行交互。
-使用线程池可以很高程度提高性能。尤其是当程序中需要大量使用生命周期比较
短的线程时,更应该考虑使用线程池。
-线程池中的每一个线程使用结束后,不会死亡,而是会再次回到线程池中,
成为空闲状态,等待下一个对象来使用。
-在早期版本中,需要手动实现线程池。现在java已经内置线程池了。
在jdk中添加了一个工厂类 Executors 我们使用工程类可以获取线程池。
static ExecutorService newCachedThreadPool()
创建一个根据需要创建新线程的线程池,但在可用时将重新使用以前构造的线程。
static ExecutorService newFixedThreadPool(int nThreads)
创建一个线程池,该线程池重用固定数量的从共享无界队列中运行的线程。
2,返回值是 ExecutorService 这个对象就表示一个线程池。
可以用来执行 Runnable对象或者Callable对象所表示的线程。
3,线程池中用来执行线程任务的方法
<T> Future<T> submit(Callable<T> task)
提交值返回任务以执行,并返回代表任务待处理结果的Future。
Future<?> submit(Runnable task)
提交一个可运行的任务执行,并返回一个表示该任务的未来。
<T> Future<T> submit(Runnable task, T result)
提交一个可运行的任务执行,并返回一个表示该任务的未来。
4,案例
package com.momo.thread;
public class MyRunnable implements Runnable{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
package com.momo.demo;
import com.momo.thread.MyRunnable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class Demo1 {
public static void main(String[] args) {
//创建线程池对象
// ExecutorService es = Executors.newCachedThreadPool();
ExecutorService es = Executors.newFixedThreadPool(10);
//调用方法执行任务
MyRunnable m = new MyRunnable();
es.submit(m);
es.submit(m);
es.submit(m);
es.submit(m);
//关闭
es.shutdown();
}
}