黑马程序--java线程池

-------------------------------------------android培训期待与您交流 -------------------------------------

 

要配置一个线程池是比较复杂的,尤其是对于线程池的原理不是很清楚的情况下,很有可能配置的线程池不是较优的,因此在Executors类里面提供了一些静态工厂,生成一些常用的线程池。

  • newSingleThreadExecutor:创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。
  • newFixedThreadPool:创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。
  • newCachedThreadPool:创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。
  • newScheduledThreadPool:创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。
  • newSingleThreadExecutor:创建一个单线程的线程池。此线程池支持定时以及周期性执行任务的需求。
public class ExecutorsTest {
public static void main(String[] args) {
        //ExecutorService  e=Executors.newFixedThreadPool(5);//创建指定线程数量的连接池,多出来的线程会等待
       //ExecutorService e=Executors.newSingleThreadExecutor();//创建单例线程的连接池
       ExecutorService e=Executors.newCachedThreadPool();//通常会创建与所需数量相同的线程,然后它会回收线程时停止创建新线程
       Executors.newScheduledThreadPool(3).schedule( new Runnable() {//定时器,下例为延迟10秒后执行
       @Override
       public void run() {
           System.err.println("botom");
          
       }
    }, 10, TimeUnit.SECONDS);//TimeUnit.SECONDS是以秒为单位
      
       Executors.newScheduledThreadPool(3).scheduleAtFixedRate(new Runnable() {//定时器,下例为开始延迟6秒后执行,以后每隔2秒执行
       @Override
       public void run() {
           System.err.println("botom");
       }
    }, 6, 2, TimeUnit.SECONDS);
     for (int i = 1; i < 10; i++) {
        final int taskCount=i;
        e.execute(new Runnable() {//传入一个runable对象
              @Override
              public void run() {
                  for (int i = 1; i < 10; i++) {
                      System.out.println(Thread.currentThread().getName()+" loop for " +taskCount);
                  }
              }
           });
    }
    e.shutdown();//关闭线程池
}
}

 

注:Executorexecutesubmit方法的区别

execute:执行没有返回参数的线程

submit:执行有返回类型的线程

如:

   

   Future<String> f=e.submit(new Callable<String>() {//submit的方法返回Future对象,Future对象的泛型类型必须和Callable的泛型类型一致
       @Override
       public String call() throws Exception {
           Thread.sleep(200);
           // TODO Auto-generated method stub
           return "hello";
       }
    });
    try {
      System.out.println("返回的结果是:"+f.get());//get()是指一直等到,直到有结果返回,get(long timeout, TimeUnit unit),在隔多少时间单位去取结果,如果没有则抛出异常
    } catch (InterruptedException e1) {
       // TODO Auto-generated catch block
       e1.printStackTrace();
    } catch (ExecutionException e1) {
       // TODO Auto-generated catch block
       e1.printStackTrace();
    } 

 

 

你可能感兴趣的:(java线程池)