线程池
为什么
1、提高程序的执行效率;
如果程序中有大量短时间任务的线程,由于创建和销毁线程需要和底层操作系统交互,大量时间都耗费在创建和销毁线程上,因而比较浪费时间,系统效率很低;线程池里的每一个线程任务结束后,并不会死亡,而是再次回到线程池中成为空闲状态,等待下一个对象来使用,因而借助线程池可以提高程序的执行效率。
2、控制线程的数量,防止程序崩溃;
如果不加限制地创建和启动线程很容易造成程序崩溃,比如高并发1000W个线程,JVM就需要有保存1000W个线程的空间,这样极易出现内存溢出;线程池中线程数量是一定的,可以有效避免出现内存溢出。
class CountThread implements Runnable{
@Override
public void run() {
for (int i = 0; i < 5; i++) {
}
}
}
public class Test {
public static void main(String[] args) {
for(;;) {
new Thread(new CountThread()).start();
}
}
}
怎么做
在JDK5之前,必须手动才能实现线程池,从JDK5开始新增了一个Executors工厂类,通过该工厂类可以实现线程池,该类有如下常用方法:
public static ExecutorService newCachedThreadPool()
public static ExecutorService newFixedThreadPool(int nThreads)
public static ExecutorService newSingleThreadExecutor()
ExecutorService 表示一个线程池,该接口常用方法:
Future<?> submit(Runnable task)
<T> Future<T> submit(Runnable task, T result)
void shutdown()
步骤:
a、创建线程池对象;
b、创建Runable接口实现类实例;
c、交Runable接口实现类实例;
d、关闭线程池
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
class CountThread implements Runnable{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
public class Test {
public static void main(String[] args) {
//创建线程池对象,该线程池中有两个闲置线程
ExecutorService pool = Executors.newFixedThreadPool(2);
//创建并提交Runable接口实现类实例
pool.submit(new CountThread());
pool.submit(new CountThread());
//关闭线程池
pool.shutdown();
}
}
还没有评论,来说两句吧...