线程运行while循环

时间:2016-12-13 09:17:24

标签: java multithreading

我有一个简单的多线程程序如下:

我有T1,T2,T3 ...... Tn线程,它们都是并行运行的。 每个线程都有一个对象队列,我想从中添加/删除项目。 在每一次添加中,我都想将其打印到屏幕上。

public void run() {
    while(!queue.isEmpty()) {
            Object obj = queue.poll();
            System.out.println(obj.toString());
    }
}

另外,我只是使用:

void addObj(Object obj) {
    this.queue.add(obj);
}

在线程的同一类中。

我在不同的时间在整个计划中使用addObj

问题当我将对象添加到队列时,run似乎并不关心。 在某些情况下,它确实打印了新对象,但在许多情况下它没有,并且它仍然认为队列为空。

如何确保线程知道正在添加此项目? 我应该使用任何回调吗? 这些任务的正确方法是什么?

  • 我也注意到,当我使用Thred.sleep()时它会有所帮助,但我觉得它看起来很丑陋。

更新:每个帖子应该拥有自己的主题。我在一个separte“thread-manger”中创建线程,逐个启动它们。 每个线程都有自己的私有队列,应该在运行时填充。 在线程开始之前和之后的任何给定时间内,可以向队列添加/删除项目。

3 个答案:

答案 0 :(得分:3)

如果队列为空,则run()方法立即结束。如果您希望线程在队列为空时工作事件,请使用以下内容:

public void run() {
    while(true) {
        if (!queue.isEmpty()) {
            Object obj = queue.poll();
            System.out.println(obj.toString());
        }
    }
}

答案 1 :(得分:0)

这是一个更漂亮的解决方案。避免轮询;)

public void run() {
    while(true) {
        if (!queue.isEmpty()) {
            Object obj = queue.poll();
            System.out.println(obj.toString());
        }
        queue.wait();
    }
}

这里是要添加的代码:

void addObj(Object obj) {
    this.queue.add(obj);
    this.queue.notify();
}

答案 2 :(得分:0)

“每个帖子都应该拥有自己的主题”你能解释一下吗? 如果您的意思是队列属于该线程,那么在进行添加后,您可以进行轮询并打印出您的消息。