如何用JAVA实现异步信息处理
要求,有多个模块会给一个专门接受消息的模块发消息
这个模块有一个list接受这些个消息,
然后有一个进程专门循环这个list处理这个消息。(比如打印出来)
应该怎么实现比较好,
我关键不会起进程。
另外,比如说好长时间没有接受消息,
等来新的消息的时候怎么唤醒处理消息的进程。
求高手指点12.。。
------解决方案--------------------
重新启动一个java程序就启动了一个进程
可以用操作系统命令行启动 Runtime.getRuntime().exec("java -classpath . XXX");
进程间通信的东西没弄过
------解决方案--------------------
可不可以在接收消息的模块中的addtolist函数中添加一个专门的处理函数,函数执行时先向list中添加消息,然后探测当前有没有处理线程,如果没有,则启动线程。
------解决方案--------------------
一个进程专门循环这个list处理这个消息。是进程还是线程?进程间共享数据,你的list不是直接就能访问的,所以估计LZ说的是线程
如果LZ想省点工作,可以用BlockingQueue来代替你的list,这样线程等待和唤醒不用你自己写代码实现了,如果非要用list,那么就自己做好同步
list的小例子,LZ自己参考发挥吧
Java code
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();
...
}
}
------解决方案--------------------
为什么不用xian程,而用进程呢?
------解决方案--------------------
既然是 web 程序 用quartz 轮询不是挺好么。
------解决方案--------------------
------解决方案--------------------