转自: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();