高级线程开发(线程池、资源封锁和队列)

来源:互联网 发布:wpf编程宝典c 2012 编辑:程序博客网 时间:2024/05/17 22:26

转自:http://my.oschina.net/dxf/blog/239

jdk1.5后,提供了java.util.concurrent包,它可以实现线程池,你把线程当成普通对象就可以了,它来负责调度和执行

包括两类线程池

固定线程池

可变线程池

延迟线程池

固定线程池

public static ExecutorService newFixedThreadPool(int nThreads)     多任务

public static ExecutorService newSingleThreadPool()   单任务

ExecutorService 的方法

Excute(Runnablecommand);

shutdown();

用法如下

Mytask mt1=new Mytask("T1");//一个线程对象实例

ExecutorService  threadpool=Executors.newFixedThreadPool(2);

threadpool.excute(mt1);

可变线程池

public static ExecutorService newCachedThreadPool()   

延迟线程池,实现定时任务

public static ScheduledExecutorService newScheduledThreadPool(int poolSize)  

它不使用excute方法了,而是使用schedule方法

public SchedualedFuture schedule(Runnable command,long delay,TimeUnit unit);

有返回值的线程池

Callable接口配合Future接口,Future接口用来接受返回值

Callable接口作用同runnable接口,不过它是实现call接口方法,这个方法还有返回值

class myCallableImpl implements Callable

{

public Object call()

{

}

}

使用

ExecutorService threadpool =Executors.newSingleThreadExector();

Future f=threadpool.submit(new myCallableImpl();

资源封锁

前面我们知道syncnized方法可以对一段代码进行资源封锁,实际上还有很多其他方法,这里总结一下

1:synchronized

2:变量volatile

3:lock接口的实现 ReentrantLock类,它有方法:lock()、unlock(),tryLock()等,注意要try……finally,防止死锁

4:ReadWriteLock接口实现 ReentrantReadWriteLock类,方法为readLock,writeLock,使用方法大致同lock接口,不过它的效率高。也要防止死锁

5:信号量 Semaphore类,信号量不同于锁,是用来实现资源分配的,但是也有锁的特性,比如连接池,保证连接池不爆炸就可以使用这个类,主要方法为:acquire(),acquire(int n),tryAcquire(),getQueueLength(),release()

6:原子对象,在jdk15后,为了简化操作,可以把一些基本类型定义为原子对象,就单线程操作了。java.util.concurrent.atomic ,作用基本同变量volatile

7:障碍器,CyclicBarrier类,让线程同步到同一个点

 

队列和堆栈

java.util.Queue接口

public boolean offer(Object);  加入

public Object poll();   出

peek();  出,但是不删除

remove();同poll

element();同peek

add();同offer

常见实现为:java.util.LinkedList  和 java.util.PriorityQueue

BlockingQueue接口

java.util.concurrent.BlockingQueue

put(Object);进

take();出

BlockingDeque接口

它是一个阻塞的堆栈接口

putFirst(object o);

takeFirst();

putLast();

takeLast();

原创粉丝点击