如何使用如此多的CPU正常停止命令队列循环?

lda*_*dam 0 java multithreading arraylist

我有一个while循环,检查包含要执行的程序的命令的arraylist是否为空.显然它会做一些事情,如果不是空的,但如果它是现在我只有一个Thread.sleep(1000)为其他.这使得与它相互作用的任何东西都相当缓慢.有没有办法让它运行的线程阻塞,直到添加一个新命令?(它运行在它自己的线程中,因此对我来说似乎是最好的解决方案)或者有更好的解决方案吗?

Gra*_*ray 5

您可以使用wait()notify()为列表添加内容的线程通知使用者线程有一些东西需要读取.但是,这需要适当的同步等.

但解决问题的更好方法是使用BlockingQueue替代方法.根据定义,它们是同步类,并且当添加内容时,出列将适当地阻塞并唤醒.LinkedBlockingQueue如果您希望您的队列不受限制,这是一个很好的类.在ArrayBlockingQueue当你想存储在队列中的项目数量有限(或者可以使用LinkedBlockingQueue与传递给构造一个整数).如果queue.add(...)队列已满,则有限队列会阻塞.

BlockingQueue<Message> queue = new LinkedBlockingQueue<Messsage>();
...
// producer thread(s) add a message to the queue
queue.add(message);
...
// consumer(s) wait for a message to be added to the queue and then removes it
Message message = queue.take();
...
// you can also wait for certain amount of time, returns null on timeout
Message message = queue.poll(10, TimeUnit.MINUTES);
Run Code Online (Sandbox Code Playgroud)