我有一个简单的多线程程序如下:
我有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”中创建线程,逐个启动它们。 每个线程都有自己的私有队列,应该在运行时填充。 在线程开始之前和之后的任何给定时间内,可以向队列添加/删除项目。
答案 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)
“每个帖子都应该拥有自己的主题”你能解释一下吗? 如果您的意思是队列属于该线程,那么在进行添加后,您可以进行轮询并打印出您的消息。