Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java线程侦听器_Java_List_Queue_Runnable - Fatal编程技术网

Java线程侦听器

Java线程侦听器,java,list,queue,runnable,Java,List,Queue,Runnable,我想创建一个可运行的类,其中包含一个列表。运行时,线程将侦听任何列表更改并处理其中的所有元素。那是我的主意 下面是我的代码,但当我将新元素添加到列表或由更改的列表时,它仍然不会执行process()。请给我一些帮助 public class QueueService implements Runnable { private List<Request> requestQueue; public synchronized void add(Request reque

我想创建一个可运行的类,其中包含一个列表。运行时,线程将侦听任何列表更改并处理其中的所有元素。那是我的主意

下面是我的代码,但当我将新元素添加到列表或由更改的列表时,它仍然不会执行process()。请给我一些帮助

public class QueueService implements Runnable {

    private List<Request> requestQueue;

    public synchronized void add(Request request) {
        if (requestQueue == null) {
            requestQueue = new LinkedList<Request>();
        }

        requestQueue.add(request);
        LOGGER.info("Added new request");
    }

    @Override
    public void run() {
        LOGGER.info("Queue started...");

        while (true) {
            if (requestQueue != null) {
                process();
            }
        } 
    }

    private synchronized void process() {
        try {
            Iterator<VMRequest> requests = requestQueue.iterator();

            while(requests.hasNext()) {
                Request req = requests.next();

                // process each element and remove when done
            }
        } catch (Exception e) {
            LOGGER.info(e.getMessage());
        }
    }
}
公共类队列服务实现可运行{
私有列表请求队列;
公共同步作废添加(请求){
if(requestQueue==null){
requestQueue=newlinkedlist();
}
添加(请求);
LOGGER.info(“新增请求”);
}
@凌驾
公开募捐{
info(“队列已启动…”);
while(true){
if(requestQueue!=null){
过程();
}
} 
}
私有同步无效进程(){
试一试{
迭代器请求=requestQueue.Iterator();
while(requests.hasNext()){
Request req=requests.next();
//处理每个元素,完成后移除
}
}捕获(例外e){
LOGGER.info(例如getMessage());
}
}
}

请理解,这根本不起作用,它告诉我们什么都没有。向我们解释你期望发生什么以及为什么。向我们解释实际发生的情况。在您的
运行中放入无限循环
方法以侦听队列。在列表中出现任何内容之前,它已退出。@SotiriosDelimanolis,请查看我的编辑帖子。@Adi我使用无限循环编辑了我的帖子,但它仍然不起作用。既然这似乎正是您想要的,为什么不使用a?