要求,有多个模块会给一个专门接受消息的模块发消息
这个模块有一个list接受这些个消息,
然后有一个进程专门循环这个list处理这个消息。(比如打印出来)应该怎么实现比较好,
我关键不会起进程。
另外,比如说好长时间没有接受消息,
等来新的消息的时候怎么唤醒处理消息的进程。
求高手指点12.。。
这个模块有一个list接受这些个消息,
然后有一个进程专门循环这个list处理这个消息。(比如打印出来)应该怎么实现比较好,
我关键不会起进程。
另外,比如说好长时间没有接受消息,
等来新的消息的时候怎么唤醒处理消息的进程。
求高手指点12.。。
可以用操作系统命令行启动 Runtime.getRuntime().exec("java -classpath . XXX");进程间通信的东西没弄过
class MessageConsumer extends Thead {
private List<YourMessageType> list;
private boolean running = true;
public MessageConsumer(List<YourMessageType> list) {this.list = list;} public void run() {
while (running) {
YourMessageType msg = null;
try {
synchronized(list) {
while (list.size() == 0) {
list.wait();
}
msg = list.remove(0);
list.notiryAll();
}
} catch (Exception e) {
e.printStackTrace();
} if (msg == null) continue; //System.out.println(msg); //print message
}
}
}//调用sample
class ShareModule {
List<YourMessageType> list = new ArrayList<YourMessageType>();
...
}public class Main {
public static void main(String[] args) {
ShareMudule sm; //so on ... Thread t = new MessageConsumer(sm.list);
t.start(); ...
}
}
谁还有想法,show一下么·········
对所接收到的消息可以考虑先进行队列化处理,便于管理,集中写入列表,当然要同步好,否则可能会产生数据安全问题(比如同时往列表中一个位置写数据,先写的数据可能就会丢失,不过还没证实过)。
List list = Collections.synchronizedList(new ArrayList(...));
Class Message---->我定义的messageClass MessageReceive---->我定义的接受Message的类,里面有一个方法
addMessage(Message message)
list.add(message);Class MessageHanndle---->我定义的处理Message的类,
while(list is not NULL)
{
handle message;
list.remove(message);
}大概意思就是上面这个意思,
要求如下:
addMessag为public void形式的
这样,只要这个message进入我的list就OK了,
不会阻塞后面message进入。MessageHanndle的main()函数一直在循环MessageList,
list里有东西就处理,肯定是没问题的,
一旦某个空闲时间段没处理,
停下来之后,
那边addMessage怎么唤醒MessageHanndle是我的问题。
不知道这样描述各位大侠能看懂了不?
addMessage(Message message) {
synchronized(list) {
list.add(message);
list.notifyAll(); //在这里唤醒其他线程
}
}之前我也说过了,用BlockingQueue来做的话,可以省去线程的等待和唤醒的控制,内部都帮你实现了
如果非要用list,那么就像我给你的例子一样,在add消息和remove消息的时候,都要同步,分别唤醒对方另,LZ可以把list封装,这样,MessageReceive和MessageHanndle只需要调用封装好的方法,不需要管list的等待或唤醒
如class MessagePool<T> {
List<T> pool = new ArrayList<T>(); public void addMessage(T msg) {
synchronized(pool) {
pool.add(msg);
pool.notifyAll();
}
} public T takeMessage() {
T msg = null;
synchronized (pool) {
while (pool.size() == 0) {
pool.wait();
}
msg = pool.remove(0);
pool.notifyAll();
} return msg;
}
}//这样,你创建一个消息池对象,
//MessageReceive只需要调用addMessage方法,
//MessageHanndle只需调用takeMessage方法就可以,不比管wait和notify的细节
MessagePool<Message> pool = new MessagePool<Message>();
...
class MessageReceive {
...
addMessage(Message msg) {
pool.addMessage(msg);
}
}class MessageHanndle {
...
while(pool != null){
Message messge = pool.takeMessage();
handle message;
}
}
这个项目不是我一个人在做,呵呵。
你说的我都明白了,正在弄,
你能再给我说说MessageHanndle怎么处理吗?以前没做过线程之类的东西,连起个线程怎么弄都不知道,
见笑了
while(true){
if(list.containsMessage()){
doHandle();
}
Thread.sleep();
}
还带唤醒功能。