| 
01 /*02  * Copyright 2008-2015 the original author or authors.
 03  *
 04  * Licensed under the Apache License, Version 2.0 (the "License");
 05  * you may not use this file except in compliance with the License.
 06  * You may obtain a copy of the License at
 07  *
 08  *     http://www.apache.org/licenses/LICENSE-2.0
 09  *
 10  * Unless required by applicable law or agreed to in writing, software
 11  * distributed under the License is distributed on an "AS IS" BASIS,
 12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 13  * See the License for the specific language governing permissions and
 14  * limitations under the License.
 15  */
 16 package org.codehaus.griffon.runtime.core.event;
 17
 18 import griffon.core.threading.UIThreadManager;
 19
 20 import javax.annotation.Nonnull;
 21 import javax.inject.Inject;
 22 import java.util.concurrent.BlockingQueue;
 23 import java.util.concurrent.LinkedBlockingQueue;
 24
 25 import static java.util.Objects.requireNonNull;
 26
 27 /**
 28  * @author Andres Almiray
 29  */
 30 public class DefaultEventRouter extends AbstractEventRouter {
 31     private final BlockingQueue<Runnable> deferredEvents = new LinkedBlockingQueue<>();
 32     protected static int count = 1;
 33     private UIThreadManager uiThreadManager;
 34
 35     public DefaultEventRouter() {
 36         Thread t = new Thread(new Runnable() {
 37             public void run() {
 38                 //noinspection InfiniteLoopStatement
 39                 while (true) {
 40                     try {
 41                         deferredEvents.take().run();
 42                     } catch (InterruptedException e) {
 43                         // ignore ?
 44                     }
 45                 }
 46             }
 47         }, getClass().getSimpleName() + "-" + identifier());
 48         t.setDaemon(true);
 49         t.start();
 50     }
 51
 52     private static int identifier() {
 53         synchronized (LOCK) {
 54             return count++;
 55         }
 56     }
 57
 58     @Inject
 59     public void setUIThreadManager(@Nonnull UIThreadManager uiThreadManager) {
 60         this.uiThreadManager = requireNonNull(uiThreadManager, "Argument 'uiThreadManager' must not be bull");
 61     }
 62
 63     protected void doPublishOutsideUI(@Nonnull Runnable publisher) {
 64         uiThreadManager.runOutsideUI(publisher);
 65     }
 66
 67     protected void doPublishAsync(@Nonnull Runnable publisher) {
 68         deferredEvents.offer(publisher);
 69     }
 70 }
 |