Using Executor 管理线程池,用线程池建立线程

来源:互联网 发布:手机淘宝客户端 编辑:程序博客网 时间:2024/06/05 00:59

一、功能:建立干活线程对象全部放入线程池中,驱动线程不用我们写了,这个线程池应该会自己去建立驱动线程

1、Executor:

 1》管理 干活线程 对象

 2》以前(new Thread  驱动线程)来驱动干活线程干活。

 3》现在不需要建立驱动干活线程了,建立好干活线程后,直接交给Executor来管理。

      对象(方法)------干活线程------驱动线程--executor

2、 Executors:产生Executor对象的工厂,由Executors来决定用Executor的哪一种类型


 Executor,ExecutorService ThreadPoolExecutor :属于同一类型

  1》Executor:是一个接口,它的实现类是ThreadPoolExecutor ,由Executors的静态方法去调用实现类。
  2》建立Executor对象时,为什么不直接使用使用 new ThreadPoolExecutor 呢?
  3》而又加一层Executors,通过Executors去建立ThreadPoolExecutor 对象呢?
     ExecutorService exec = Executors.newSingleThreadExecutor();
     ExecutorService:就是在Executor 的基础上加了一些功能。

   答案:也许还是用java经常谈的Factory模式,即所有新建的对象放在一个工厂(Executors)里建立。 

             因为Executor可以有多种对象,根据池子的能放干活线程的多少分成以下三种,

              Executor的种类:CachedThreadPool,FixedThreadPool,SingleThreadExecutor

二、池子能放多少线程的几种规定

1、CachedThreadPool :池子可以放许多线程 ,个数不限制。              

package concurrency;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CachedThreadPool {
public static void main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPool();
for (int i = 0; i < 5; i++)
exec.execute(new LiftOff());
exec.shutdown();
}
}
//Very often, a single Executor can be used to create and manage all the tasks in your system:一个Executor 对象能管理所有对象的任务。    

 方法:ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>());

   功能:1》在缓冲区建立一个池子,放新的干活线程,但要用干活线程时先去池子里找,有,就用上,没有,就建立一个新干活线程扔到池子里。

                2》如果在一个线程池里的线程60秒不用,则从池中删除此线程。

2、FixedThreadPool: 池中只能放几个固定的干活线程数,当建立Executor对象时就定义好。

      例子:线程池每次只允许5个干活线程。

  package concurrency;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class FixedThreadPool {

public static void main(String[] args) {
// Constructor argument is number of threads:
ExecutorService exec = Executors.newFixedThreadPool(5);
for (int i = 0; i < 5; i++)
exec.execute(new LiftOff());
exec.shutdown();
}
}     

3、SingleThreadExecutor:这下好,池子放的干活线程数,越来越少了,一个池子只放一个干活线程。

        主要是一个任务完成后,才调用下一个任务,哪么要线程池干吗?以前对象也是这样执行的?不懂????

package concurrency;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class SingleThreadExecutor {
public static void main(String[] args) {
ExecutorService exec = Executors.newSingleThreadExecutor();
for (int i = 0; i < 5; i++)
exec.execute(new LiftOff());
exec.shutdown();
}
}new ThreadPoolExecutor(1, 1,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()));



参考文章:http://www.cnblogs.com/MOBIN/p/5436482.html