fred-ye / summary

my blog
43 stars 9 forks source link

[JavaSE][线程池] #10

Open fred-ye opened 10 years ago

fred-ye commented 10 years ago

在编程世界中池通常是用来提前创建资源。如数据库连接池,会提前创建一些数据库连接。同理,线程池是提前创建线程,放到空闲队列中,然后对线程资源进行复用,减少频繁创建和销毁对象引起的资源消耗,提高系统的性能。

Executors类:相当于是一个工具类,提供了一些静态方法,生成一些常用的线程池。 两个常用的方法:

ExecutorService ex = Executors.newFixedThreadPool(2);
ex.executor(thread1);
ex.executor(thread2);
ex.executor(thread3); //可以看到只有前两个线程执行完了,第三个线程才会执行。
  • newCachedThreadPool 创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者JVM)能够创建的最大线程大小。
  • newScheduledThreadPool 创建一个无固定大小的线程池,此线程池支持定时以及周期性执行任务的需求。

在项目中有这么一个需求。我们的一个页面上有四个按钮,每点一个按钮便会发一次请求去Server端拿数据。如果用户快速的点击,那么就会起多个线程。但实际上最终显示在页面上的只会是最后一次请求所拿到的数据。因此我们可以采用这种思路去做,如果用户是快速不断的切换按钮,每次点击都起一个线程,我们将线程交给线程池来管理。那么对于尚未执行的线程,就将其从线程池中清除掉,以下就是示例代码:

singleThreadPool = Executor.newFixedThreadPool(1);
ThreadPoolExecutor pool = (ThreadPoolExecutor)singleThreadPool;
pool.getQueue().clear();
pool.execute(thread);