java-线程池与原子(Automic)

1.Executors类

    |-java.util.concurrent.Executors 它可以提供了多种功能的线程池
   静态方法:

            ExecutorService  newFixedThreadPool(int nThreads); //创建固定大小的线程池

            ExecutorService  newCachedThreadPool();//创建缓存线程池

            ExecutorService  newSingleThreadExecutor();//创建单一线程池

      ScheduledExecutorService  newScheduledThreadPool(int);//创建定时处理的线程池

2.ExecutorService

  成员方法:

     void shutdown();//对于执行完所有任务的线程会处于wait状态,所以最后需要
                                      Executors类的shutdown方法销毁执行完任务的线程

        void execute(Runnable command);//可以添加多个任务

        Future<T> submit(Callable<T> task);//在task里会调用call方法,将结果返回给future

3.ScheduledExecutorService

     schedule(Runnable command, long delay, TimeUnit unit);//创建并执行在给定延迟后启用的一次性操作

            线程池启动定时器
            调用ScheduledExecutorService的schedule方法,返回的ScheduleFuture对象可以取消任务。
            支持间隔重复任务的定时方式,不直接支持绝对定时方式,需要转换成相对时间方式。

4.CompletionService<V>

   所有已知实现类:ExecutorCompletionService   它是ExecutorService里submit方法的加强版,可以submit多个Callable<T> task,使用者take会按照完成这些任务的顺序处理它们的结果(get方法返回结果)。

      成员方法:

Future<V> take();//获取并移除表示下一个已完成任务的 Future,如果目前不存在这样的任务,则等待。

Future<V> submit(Callable<V> task);//提交要执行的值返回任务,并返回表示挂起的任务结果的 Future。

 

//ExecutorService类下的<T> Future<T> submit(Callable<T> task) 方法使用
         ExecutorService pool= Executors.newSingleThreadExecutor();
         Future<String> future=pool.submit(new Callable<String>() {

            @Override
            public String  call() throws Exception {
                // TODO Auto-generated method stub
                System.out.println(Thread.currentThread().getName());
                Thread.sleep(3000);
                 
                return "哈哈哈";
            }
        });
      System.out.println("等待结果");
      System.out.println("结果:"+future.get());
      //ExecutorCompletionService类演示
      CompletionService<Integer> service=new ExecutorCompletionService<Integer>(Executors.newFixedThreadPool(3));
      //submit 10个task
      for(int i=0;i<10;i++)
      {
          final int t=i+1;
          service.submit(new Callable<Integer>() {
            
            @Override
            public Integer call() throws Exception {
                 Thread.sleep(new Random().nextInt(5)*1000);
                return t;
            }
        });
      }
      //按先后顺序取出结果
      for(int j=0;j<10;j++)
      {
          System.out.println(service.take().get());
      }

 

     

//线程池的演示:Executors类下(静态方法)提供了多种功能的线程池
      /*  注意:可以添加任意个任务进去.(ExecutorService类下的void execute(Runnable command)方法)
       *  创建固定大小的线程池:Executors.newFixedThreadPool(3);3为自动启动3个线程执行任务
                      创建缓存线程池:Executors.newCachedThreadPool();//系统会根据你添加多少任务智能分配多少个线程帮你执行
                      创建单一线程池:Executors.newSingleThreadExecutor();//系统会保证始终一个线程帮你执行任务,如果该线程死了,系统会创建出另一个线程代替。

创建定时处理的线程池:Executors.newScheduledThreadPool(3).schedule()方法     
                     注意:对于执行完所有任务的线程会处于wait状态,所以最后需要
               Executors类的shutdown方法销毁执行完任务的线程。      
       * */  
        ExecutorService pool=Executors.newFixedThreadPool(3);
        Executors.newCachedThreadPool();
        Executors.newSingleThreadExecutor();
        //添加任务
        for(int i=0;i<5;i++)
        {
            final int task =i+1;
            pool.execute(new Runnable() {
                
                @Override
                public void run() {
                    for(int j=0;j<10;j++)
                    System.out.println(Thread.currentThread().getName()+"执行第"+task+"个任务:"+(j+1));
                }
            });
         }
        System.out.println("shutdown");
        pool.shutdown();

 

 5.java.util.concurrent.atomic下

  有很多对基本数据的原子(同步)操作,甚至是类中的成员变量

posted @ 2015-03-07 10:49  beyondbycyx  阅读(497)  评论(0编辑  收藏  举报