java线程管理利器:java.util.current的用法举例

 

JDK5中增长了Doug Lea的并发库,这一引进给java线程的管理和使用提供了强大的便利性。 java

java.util.current包中提供了对线程优化、管理的各项操做,使得线程的使用变得的心应手。该包提供了线程的运行,线程池的建立,线程生命周期的控制,线程间的协做等功能。 并发

1、核心API介绍 优化

1 this

Executor接口 spa

public void 线程

execute(Runnable runnable); code

该接口声明了execute方法,将Runnable对象传入,启动该方法至关于启动了该线程 对象

2ExecutorService接口 接口

该接口是Executor的子接口,提供了submit方法,该方法返回Future对象,Future可用于控制线程的执行 生命周期

与取消

3ScheduledExecutorService接口

 该接口是ExecutorService的子接口,提供了线程启动时机的控制

 4Callable接口

 提供了以下方法

 public Object call() throws Exception;

 该接口相似Runnable接口,只是有返回值和抛出的异常,该方法返回的值就是ExecutorService接口调用 

submit(Callable

call)方法的Future调用get方法返回的值。

5Future接口

Future接口用于控制线程的执行。调用cancell(boolean

bool)方法将会取消正在运行的进程。

另外ExecutorServiceshutDown()方法将启动一次顺序关闭,执行之前提交的任务,但不接受新任务。如  果已经关闭,则调用没有其余做用;shutDownNow()方法试图中止全部正在执行的活动任务,暂停处理正在等待的任务,并返回等待执行的任务列表。

6Executors

这是一个线程池的工厂类,该类提供了许多生成ExecutorExecutorServiceScheduleExecutorService的工厂方法。

 其实,Executor就至关于一个线程池,提供对线程的管理功能,包括启动线程,取消线程执行,加入线  程,移除线程,以及协调线程之间的工做等功能,这些随着Executor级别(即子接口,实现类)越高而功  能越强。

2、应用简介

1、启动一个线程

Executor executor=Executors.newFixedThreadPool(3);

executor.execute(new Ruannble(){

     public void run(){

       //your code

     }

 });

也能够启动Callable形式的线程

ExecutorService executor=Executors.newFixedThreadPool(3);

executor.submit(new Callable(){

    public Object call()throws Exception{

         Object o=null;

         // your code;

         return o;

    }

});

注意,以上的方法每执行一次就运行一次RunnableCallable对象的run(),call()方法,若是生成的Executor对象指定了数目,例如上面中是3,则当调用execute方法或submit方法时到达3次以上时,实际上同时运行的线程最多只有3个,是按照顺序的(即多出来的,后放进去的线程没有运行),只有当Executor池中正在运行的线程少于3个(即某些线程处于idle空虚状态,不在运行了),其后多出来的线程才会开始运行(按调用执行的顺序),但任什么时候候最多只能有3个线程运行。

同一个线程能够被执行屡次,多长调用执行方法就好了。

2、取消线程的执行

当想终止线程的执行时,能够调用Futurecancell方法,但也不必定可以终止;另外若是是ExecutorSrvice,也能够调用shutDownNow或者shutDown方法。shutDown方法将等待当前的线程执行完毕后终止全部的线程,而shutDownNow试图中止全部正在执行的活动任务,暂停处理正在等待的任务,并返回等待执行的任务列表。

3、顺序执行线程

ExecutorService executor=Executors.newFixedThreadPool(3);

Future future=executor.submit(r1);//r1RunnableCallable实例

future.get();

executor.submit(r2);/r2RunnableCallable实例

以上代码将会使r1执行完后再执行r2,由于Futureget方法具备阻塞调用者线程的功能,执行get方法时,将会等待Future对应的线程执行完毕后才会返回结果,其会阻塞调用者线程。

4、从线程池中添加与移除线程

要移除线程,则须要ExecutorService接口的实现类ThreadPoolExecutor或其子类的方法。

在线程池中添加线程

调用executesubmit方法均可以将线程加入线程池,对同一个线程重复调用也能够,也至关于调用2个不一样线程,只不过执行相同的代码。

在线程池中删除线程

public boolean remove(Runnable task)

 从执行程序的内部队列中移除此任务(若是存在),从而若是还没有开始,则其再也不运行,若是已经删除则返回true


public void purge()
      
尝试从工做队列移除全部已取消的 Future 任务。

5
、线程的协做
利用CyclicBarrier能够协调线程的之间的运行,它容许一组线程互相等待,直到到达某个公共屏障点。
例若有一项工做须要有2我的完成,而这项工做有2个步骤,只有在执行第一个步骤只后,才能够执行第二个步骤,每个步骤都须要2我的参与。这时可使用CyclicBarrier了。2我的表明2个线程,以下。
class Worker implements Runnable{
    private Work work;
    private int speed;
    public Work(Work work,int speed){
         this.work=work;
         this.speed=speed;
    }
    public void run(){
        work.worked(speed);
    }
   
}
class Work {
   
    private CyclicBarrier barrier;
    public Work(CyclicBarrier barrier){
      
       this.barrier=barrier;
    }
    public void worked(int speed){
        firstWork(speed);
        secondWork();
    } 
    private void firstWork(int speed){
        
        barrier.await();
        try{
        Thread.sleep(speed);
        }catch(Exception e){
        }
    }
    private void secondWork(){
        
        barrier.await();
    }
}

 public static void main(String args[]){
    CyclicBarrier barrier=new CyclicBarrier(2);
    Work work=new Work(barrier);
    Worker worker1=new Worker(work);
    Worker worker2=new Worker(work);
    Executor executor=Executors.newFixedPoolThread(2);
    executor.execute(worker1);
    executor.execute(worker2);
}

6
、线程池的线程回收
CompletionService
是一个管理执行完毕的线程的类,以Executor为参数构造实例。submit方法用于提交任务,彷佛是委派给Executor执行,而take()方法则是获取并移除表示下一个已完成任务的 Future,若是目前不存在这样的任务,则等待。,pool也相似只不过当时没有时返回null并不等待。

相关文章
相关标签/搜索