如何使用runnable在Singleton中工作?

时间:2016-02-26 17:17:50

标签: java multithreading singleton runnable

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

我有一个单一的EventCoordinator类,因为它是处理所有事件的那个(因为我的任务要求我这样做)。 事件将添加到此协调器,稍后将进行处理。 事件必须在不同的线程中处理,其中run接受队列的事件并处理它们。 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
    }

}

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

3 个答案:

答案 0 :(得分:2)

你想做罗马所说的话:

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 coordinator方法中处理队列项的方式。

话虽如此,&#34;首选&#34;单一方法(根据Joshua Bloch的Effective Java)是使用带有单个元素的枚举。如果你保持原样,你至少应该使用像罗马这样的private访问者方法来public字段select to_number(price) b from a order by b; { "requestID": "6642f123-08c1-4ec2-9380-c11c9fd05c60", "signature": { "b": "number" }, "results": [ { "b": 1 }, { "b": 18 }, { "b": 156 }, { "b": 175 } ], "status": "success", "metrics": { "elapsedTime": "9.39578ms", "executionTime": "9.36118ms", "resultCount": 4, "resultSize": 125, "sortCount": 4 } }

答案 1 :(得分:1)

尝试下一步(简单的singelton实现):

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

thread = new Thread(EventCoordinator.getEventCoordinator())

答案 2 :(得分:0)

您可以从start方法启动匿名线程,在匿名线程的run方法中,您可以调用事件协调器的实际处理队列的run方法。如果删除事件协调器的runnable接口,则不必调用事件协调器的run方法,并且可以直接在匿名线程的run方法中完成队列处理。可能存在从队列中处理或移除元素以及同时在队列中添加元素的情况。您将不得不使用synchronized块或某些锁来处理并发。