如何用JAVA实现异步信息处理

发布网友 发布时间:2022-04-23 06:06

我来回答

3个回答

热心网友 时间:2023-09-15 01:35

通常同步意味着一个任务的某个处理过程会对多个线程在用串行化处理,而异步则意味着某个处理过程可以允许多个线程同时处理。异步通常代表着更好的性能,因为它很大程度上依赖于缓冲,是典型的使用空间换时间的做法,例如在计算机当中,高速缓存作为cpu和磁盘io之间的缓冲地带协调cpu高速计算能力和磁盘的低速读写能力。

(1):重新启动一个java程序就启动了一个进程
可以用操作系统命令行启动 Runtime.getRuntime().exec("java -classpath . XXX");

(2):可不可以在接收消息的模块中的addtolist函数中添加一个专门的处理函数,函数执行时先向list中添加消息,然后探测当前有没有处理线程,如果没有,则启动线程。

(3):想省点工作,可以用BlockingQueue来代替list,这样线程等待和唤醒不用写代码实现了,如果非要用list,那么就做好同步

list的小例子:

Java codeclass 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        }    }}//调用sampleclass ShareMole {    List<YourMessageType> list = new ArrayList<YourMessageType>();    ...}public class Main {    public static void main(String[] args) {        ShareMule sm; //so on        ...        Thread t = new MessageConsumer(sm.list);        t.start();        ...    }}

热心网友 时间:2023-09-15 01:35

一个进程专门循环这个list处理这个消息。是进程还是线程?进程间共享数据,你的list不是直接就能访问的,所以估计LZ说的是线程

如果LZ想省点工作,可以用BlockingQueue来代替你的list,这样线程等待和唤醒不用你自己写代码实现了,如果非要用list,那么就自己做好同步

list的小例子,LZ自己参考发挥吧

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 ShareMole {
List<YourMessageType> list = new ArrayList<YourMessageType>();
...
}

public class Main {
public static void main(String[] args) {
ShareMule sm; //so on

...

Thread t = new MessageConsumer(sm.list);
t.start();

...
}
}

热心网友 时间:2023-09-15 01:36

jms,一般常用的实现是 activemq

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com