java多线程(2):并发编程实践(六)

2014-11-24 02:42:53 · 作者: · 浏览: 11
w Runnable() {
@Override
public void run() {
//2个写线程
for(int i = 0; i < 2; i++){
//消费
final int writeId = i;
executorService.execute(new Runnable(){
@Override
public void run() {
writeLock.lock();
try {
System.out.println("线程" + writeId +"开始写");
// 读处理
TimeUnit.MILLISECONDS.sleep(500);
System.out.println("线程" + writeId + "写完成");
}catch (InterruptedException e){
e.printStackTrace();
}finally {
writeLock.unlock();
}
}
});
}
}
});
}

}


第9章:信号量Semaphore

第0节:札记

* 获得一项前,每个线程必须从信号量获取许可,从而保证可以使用该项。
* 该线程结束后,将项返回到池中并将许可返回到该信号量,从而允许其他线程获取该项。
* 注意,调用 acquire() 时无法保持同步锁,因为这会阻止将项返回到池中。
* 信号量封装所需的同步,以限制对池的访问,这同维持该池本身一致性所需的同步是分开的。

第1节:实例

package com.mcc.core.test.thread;

import com.mcc.core.concurrent.ExecutorServiceUtils;

import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
* 信号量线程控制实例测试
*
* @author menergy
* DateTime: 13-12-30 下午3:47
*/
public class SemaphoreTest {
public static void main(String args[]){
//信号量,初始化2
final Semaphore semaphore = new Semaphore(2);
//同步锁
final Lock lock = new ReentrantLock();
//资源池
final ArrayList resourcePool = new ArrayList ();
for (int i = 0; i < 8; i++) {
resourcePool.add("Resource " + i);
}
ExecutorService executorService = ExecutorServiceUtils.getExecutor("test", 5);
//启动5个线程执行5个任务
for (int i = 0; i < 5; i++) {
executorService.submit(new Runnable(){
@Override
public void run() {
try {
//获取通行证,只有得到通行证后才能得到资源
semaphore.acquire();
System.out.println("获取通行证,可用数量:" + semaphore.availablePermits());
//取走资源,需同步
lock.lock();
String resource = resourcePool.remove(0);
System.out.println("取走资源:" + resource + "资源池:" + resourcePool.toString());
lock.unlock();
//使用资源
System.out.println("使用资源:" + resource + "资源池:" + resourcePool.toString());
TimeUnit.MILLISECONDS.sleep(2000);
//归还资源,需同步
lock.lock();
resourcePool.add(resource);
System.out.println("归还资源:" + resource + "资源池:" + resourcePool.toString());
lock.unlock();
//释放许可证,可以给其它线程使用
semaphore.release();
System.out.println("释放通行证,可用数量:" + semaphore.availablePermits());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}

executorService.shutdown();

}
}