gpt4 book ai didi

java - 如何使用可运行对象在Singleton中工作?

转载 作者:行者123 更新时间:2023-12-03 12:55:20 25 4
gpt4 key购买 nike

我有一个关于使用runnable在单例中工作的问题。

我有一个EventCoordinator类,它是单例的,因为它是处理所有事件的类(并且由于我的作业要求我这样做)。
事件将添加到此协调器中,并将在以后进行处理。
必须在不同的线程中处理事件,在该线程中,运行将获取队列的事件并对其进行处理。 start方法应该启动一个新线程,该新线程使用run接收队列事件。

final public class EventCoordinator implements Runnable {

protected final static EventCoordinator coordinator = new EventCoordinator();
protected static LinkedList<QueueItem> queue = new LinkedList<QueueItem>();
private EventBroker() {
}

private class QueueItem {
protected Event event;


public QueueItem(Event event) {
this.event = event;
}
}

public static EventCoordinator getEventCoordinator () {
return coordinator;
}

public void addEventObserver(EventObserver o) {
//adds listeners to the coordinator
}



void addEvent(EventPublisher source, Event e) {
QueueItem queueItem = new QueueItem(e, source);
synchronized(this) { queue.add(queueItem); }
}


public void run() {
// Process items from the queue
}

public void start() {
// start a new thread that processes items of the queue
}

}

但是我理解可运行对象的方式是,当您创建 thread = new Thread(New EventCoordinator)时,您将创建一个新的EventCoordinator对象,因此不再在同一队列上工作。
那么如何使用可运行对象来完成队列的这项工作呢?我可以将队列设为静态吗?我是否实现方法以从队列中添加和删除项目,并在getEventCoordinator返回的协调器上调用它们?

最佳答案

您想做罗曼说的话:

public static synchronized EventCoordinator getEventCoordinator() {
if (coordinator == null) {
coordinator = new EventCoordinator();
}
return coordinator;
}

这样,当您调用 getEventCoordinator()时,您只会得到一个实例……您不想使用 thread = new Thread(new EventCoordinator()),因为这违反了单例的目的。

当您在 thread = new Thread(EventCoordinator.getEventCoordinator())方法中调用 start()时,它将使用单例实例作为 Runnable创建线程。然后只需在 run()EventCoordinator方法中定义您要如何处理队列项目。

话虽如此,单例的“首选”方法(根据Joshua Bloch的Effective Java)是使用带有单个元素的枚举。如果保持原样,则至少应使用类似于Roman的 coordinator访问器方法将 private字段设为 public

关于java - 如何使用可运行对象在Singleton中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35657857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com