实际上有一个单独Runnable的,其中执行一些操作。这个Runnable有一个这些动作的队列。在这些动作的执行之间有一个时间 - timeout,在执行下一个动作之前必须经过。如果队列为空,那么线程应该休眠,但是一旦有新的“任务”添加到队列中,它就Runnable应该唤醒并执行它。我做了一个素描课:
public final class TitleHelper implements Runnable {
private static TitleHelper instance = new TitleHelper();
public static TitleHelper getInstance() {
return instance;
}
private TitleHelper() {
}
private static final Queue<Title> titleQueue = new ArrayDeque<>();
@Override
public void run() {
if (titleQueue.size() > 0) {
Title title = titleQueue.poll();
title.show();
TimeUnit.SECONDS.sleep(title.getShowTime());
} else {
TimeUnit.SECONDS.sleep(Integer.MAX_VALUE);
}
}
public void add(Title title) {
titleQueue.offer(title);
//при добавлении нового объекта в очередь на показ нужно разбудить спящий поток выше.
}
}
问题:
- 如何实现我最初写的(使用线程唤醒)?
我如何正确选择实施方法?它有哪些不足之处以及如何改进?
我也明白
ArrayQeque-not safe thread添加和删除()时如何同步,poll以免从另一个线程获得更改异常?
使用
Condition.宣布:
然后它
run会是这样的:答
add:相当可行。
Lock,如我的例子,要么使用一些线程BlockingQueue。