在JDK5.0以后,JAVA提供了新的更加健壮的线程处理机制,包括了同步、锁定、线程池等等,它们可以实现更小粒度上的控制。await()和signal()就是其中用来做同步的两种方法,它们的功能基本上和wait()/notify()相同,完全可以取代它们,但是它们和新引入的锁定机制Lock直接挂钩,具有更大的灵活性。
下面是一个例子代码:
import java.util.LinkedList;
import java.util.concurrent.locks.*;
public class Sycn{
private LinkedList<Object> myList = new LinkedList<Object>();
private int MAX = 10;
private final Lock lock = new ReentrantLock();
private final Condition full = lock.newCondition();
private final Condition empty = lock.newCondition();
public Sycn(){
}
public void start(){
new Producer().start();
new Consumer().start();
}
public static void main(String[] args) throws Exception...{
Sycn2 s2 = new Sycn2();
s2.start();
}
class Producer extends Thread{
public void run(){
while(true){
lock.lock();
try{
while(myList.size() == MAX){
System.out.println("warning: it's full!");
full.await();
}
Object o = new Object();
if(myList.add(o)){
System.out.println("Producer: " + o);
empty.signal();
}
}catch(InterruptedException ie){
System.out.println("producer is interrupted!");
}finally{
lock.unlock();
}
}
}
}
class Consumer extends Thread{
public void run(){
while(true){
lock.lock();
try{
while(myList.size() == 0){
System.out.println("warning: it's empty!");
empty.await();
}
Object o = myList.removeLast();
System.out.println("Consumer: " + o);
full.signal();
}catch(InterruptedException ie){
System.out.println("consumer is interrupted!");
}finally...{
lock.unlock();
}
}
}
}
}
在项目开发过程中,刚好有需求可以用生产者消费者模式来完成。不过上面的代码逻辑过于简单,无法满足现在的需求。需求中需要查询数据库来获取数据,然后对数据进行一些处理,最后再将数据更新到数据库中。对上面的代码稍作修改,即可满足需求。
修改后的代码如下:
import java.util.LinkedList;
import java.util.concurrent.locks.*;
public class Sycn{
private LinkedList<Data> myList = new LinkedList<Data>();
private int MAX = 10;
private final Lock lock = new ReentrantLock();
private final Condition full = lock.newCondition();
private final Condition empty = lock.newCondition();
public Sycn(){
}
public void start(){
new Producer().start();
new Consumer().start();
}
public static void main(String[] args) throws Exception...{
Sycn2 s2 = new Sycn2();
s2.start();
}
class Producer extends Thread{
public void run(){
while(true){
lock.lock();
try{
while(myList.size() == MAX){
System.out.println("warning: it's full!");
full.await();
}
LinkedList<Data> searchDataList = DAO.getSearchDataList();//伪代码,改成相关查询逻辑调用即可
for(Data data : searchDataList){
mylist.add(data);
if (myList.size() == MAX){
break;//当列表满时,不再加入数据
}
}
empty.signal();
System.out.println("producer is interrupted!"); }finally{ lock.unlock(); } } } }
class Consumer extends Thread{
public void run(){
while(true){
lock.lock();
try{
while(myList.size() == 0){
System.out.println("warning: it's empty!"); empty.await();
}
List<Data> updateDataList = new ArrayList<Data>();
while(0!=myList.size){
updateDataList .add(myList.removeLst());
}
Dao.updateDataList(updateDataList);//伪代码,调用相关更新逻辑
full.signal();
}catch(InterruptedException ie){
System.out.println("consumer is interrupted!");
}finally...{
lock.unlock(); }
}
}
}