Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.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_Multithreading_Producer Consumer - Fatal编程技术网

Java 一个队列的多个生产者不工作

Java 一个队列的多个生产者不工作,java,multithreading,producer-consumer,Java,Multithreading,Producer Consumer,这是Java7并发烹饪书中的一个练习。目标是让多个生产者将事件写入共享队列,而更干净的任务(守护进程线程)将从队列中删除早于5秒的事件。(查找下面的代码) 如果我尝试为此编写测试或在main()程序中使用它,它只会在队列中插入3项并退出。 我的问题:如果WriterTask中有for循环,为什么程序不运行for循环过程(在队列中插入~30项)并在此之前退出? import java.util.Date; import java.util.Deque; import java.util.concu

这是Java7并发烹饪书中的一个练习。目标是让多个生产者将事件写入共享队列,而更干净的任务(守护进程线程)将从队列中删除早于5秒的事件。(查找下面的代码) 如果我尝试为此编写测试或在main()程序中使用它,它只会在队列中插入3项并退出。 我的问题:如果WriterTask中有for循环,为什么程序不运行for循环过程(在队列中插入~30项)并在此之前退出?

import java.util.Date;
import java.util.Deque;
import java.util.concurrent.TimeUnit;
class Event{
    Date var;
    public Event(Date v){
        var = v;
    }
}
class WriterTask implements Runnable{
    Deque<Event> queue;
    int from = 0,to = 0;
    public WriterTask(Deque<Event> queue, int from, int to){
        this.queue = queue;
        this.from = from;
        this.to = to;
    }
    @Override
    public void run(){
        for(int i=from;i<to;i++){
            Event ev = new Event(new Date());
            System.out.println("Generating event number: "+i);
            queue.addFirst(ev);
            try{
                System.out.println("SLeeping now:"+Thread.currentThread().getName());
                TimeUnit.SECONDS.sleep(1);
            }catch(InterruptedException ie){
                System.out.println("Interrupted the thread!");
            }
        }
    }
}


class CleanerTask implements Runnable{
    Deque<Event> queue;

    public CleanerTask(Deque<Event> queue){
        this.queue = queue;
    }
    @Override
    public void run(){
        while(true){
            Date dt = new Date();
            clean(dt);
        }
    }

    public void clean(Date date){
//        System.out.println("Cleaning for date, current size of queue:"+queue.size());
        long difference = 0;
        boolean anythingDeleted = false;
        do{
            if(queue.isEmpty()){return;}
            Event first = queue.getLast();
            difference = date.getTime() - first.var.getTime();
            if(difference >  5000){
                queue.removeLast();
                anythingDeleted = true;
            }
        }while(difference>5000);
        if(anythingDeleted){
            System.out.println("Queue cleaned up, new size:"+queue.size());
        }
    }
}

您不是在等待线程完成

在代码末尾添加:

cleanerTask.start();
// Wait for everything to finish.
wt1.join();
wt2.join();
wt3.join();
cleanerTask.join();

基本上,主线程必须在退出之前加入所有其他正在运行的线程。

这正是我最终要做的。我的印象是,只要程序中有活动线程(state=RUNNABLE和notterminated),它就会继续运行。谢谢你的回答!
Size of queue:0
Final Size of queue:0
Generating event number: 0
Generating event number: 60
SLeeping now:Thread-1
Generating event number: 100
SLeeping now:Thread-2
SLeeping now:Thread-0

Process finished with exit code 0
cleanerTask.start();
// Wait for everything to finish.
wt1.join();
wt2.join();
wt3.join();
cleanerTask.join();