线程池

为什么
       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();
	}
}

 

发布了327 篇原创文章 · 获赞 571 · 访问量 164万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 书香水墨 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览