java并发编程实战
/**
* FILE: MessageList.java
*
* PURPOSE: Which is used to store all of message by LinkedList
*
* NOTES:
*
* Copyright notice: Beijing Samsung Telecom R&D
*
* @version V1.0 Created on 2011-08-31
* @author BST C-Femto Project
*/
package com.samsung.NBI.Main;
import java.util.LinkedList;
public class MessageList {
//static int num = 0;
LinkedList linkedMessage;
boolean availableGet;
boolean availableAdd;
boolean available;
static MessageList instance_ = null;
// private static Logger log = Logger.getLogger(MessageList.class);
private Integer syncObject = new Integer(0);
//static boolean syncAddTag = true; //
protected MessageList(){
availableAdd = true;
availableGet = false;
available = false;
linkedMessage = new LinkedList();
}
public static MessageList getInstance(){
if(null == instance_){
instance_ = new MessageList();
}
return instance_;
}
/**
* PURPOSES: which is used to retrieve the message info from LinkedList object
* PARAMETERS:
* @param
* RETURNS: Object, which is a Message object
* NOTES: It is thread-safe, and only one Message can be get each time
*/
public Object getMessage(){
LinkedList list = null;
synchronized(syncObject){
while(false == available){ //after finishing the get operation, linkedMessage is null, so wait
try{
syncObject.wait();
}catch(InterruptedException ie){
ie.printStackTrace();
}
}
if(linkedMessage.size()!=0){
list = new LinkedList(linkedMessage);
linkedMessage.clear();
//log.info("Info: Obtained one message from queue......");
//System.out.println("!!! !!! Obtained one message from queue......");
}
available = false;
syncObject.notifyAll(); //wakeup the waiting's put operation
}
return list;
}
/**
* PURPOSES: which is used to add the Message info into LinkedList object
* PARAMETERS:
* @param: Message
* RETURNS: void
* NOTES: It is thread-safe, and only one Message can be added each time
*/
public void addMessage(Message e){
synchronized(syncObject){
while (true == available){
try{
syncObject.wait();
}catch(InterruptedException ie){
ie.printStackTrace();
}
}
linkedMessage.add(e);
//log.info("Info: Put one message into queue......");
//System.out.println("!!! !!! put one message into queue......");
available = true;
syncObject.notifyAll();
}
}
/**
*
*Only for test
*
*/
public int getSize(){
return linkedMessage.size();
}
/**
* Test Result: get and put method must be working together, if only one get mehtod,
* it will be blocked, and wait for put method, only after put method, the get method can be going
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MessageList instance = MessageList.getInstance();
/*TestEventQueueThread thread1 = new TestEventQueueThread(0,10000);
thread1.start();
TestEventQueueThread thread2 = new TestEventQueueThread(100000,10000);
thread2.start();
*/
ScanMessageListThread read = new ScanMessageListThread(20000);
read.start();
}
}