Java 8 Singleton,无法进入可运行任务

Java 8 Singleton,无法进入可运行任务,java-8,runnable,scheduledexecutorservice,vaadin8,Java 8,Runnable,Scheduledexecutorservice,Vaadin8,我正在尝试自动运行任务(所有30秒) 为此,我构建了一个singleton: public class PortalSingleton { private static final Logger LOG = LoggerFactory.getLogger(PortalSingleton.class); private static final int INITIAL_DELAY = 0; private static final int DELAY = 30;

我正在尝试自动运行任务(所有30秒)

为此,我构建了一个singleton:

public class PortalSingleton {
    private static final Logger LOG = LoggerFactory.getLogger(PortalSingleton.class);
    private static final int INITIAL_DELAY = 0;
    private static final int DELAY = 30;

    private static volatile ScheduledExecutorService instance;
    private static HomepageView homeView = new HomepageView();

    private PortalSingleton() {}

    public static final void refreshGridHomePageAutomatically() {
        Runnable task = () -> UI.getCurrent().access(() -> {
            homeView.refreshGrid();
            LOG.info("The grid has been refreshed Automatically");
        });
        getInstance().scheduleWithFixedDelay(task, INITIAL_DELAY, DELAY, TimeUnit.SECONDS);
    }

    public final static ScheduledExecutorService getInstance() {
        if (instance == null) {
            synchronized (ScheduledExecutorService.class) {
                if (instance == null) {
                    instance = Executors.newScheduledThreadPool(1);
                }
            }
        }
        return instance;
    }
}
但是,我没有任何问题/错误,我没有日志消息,我的网格也没有刷新

预期的行为是:

  • 我的网格刷新
  • 请参阅日志消息
  • 即使我删除了行
    homeView.refreshGrid(),我没有日志消息

    我做错了什么

    谢谢

    编辑:我通过执行以下操作来调用它:
    PortalSingleton.refreshGridHomePageAutomatically()

    EDIT2,谢谢@Holger:

    public class PortalSingleton {
        private static final Logger LOG = LoggerFactory.getLogger(PortalSingleton.class);
        private static final int INITIAL_DELAY = 0;
        private static final int DELAY = 30;
    
        private static final ScheduledExecutorService instance = Executors.newScheduledThreadPool(1);
        private static HomepageView homeView = new HomepageView();
    
        private PortalSingleton() {
        }
    
        public static final void refreshGridHomePageAutomatically() {
            Runnable task = () -> UI.getCurrent().access(() -> {
                homeView.refreshGrid();
                LOG.info("The grid has been refreshed Automatically");
            });
            try {
                getInstance().scheduleWithFixedDelay(task, INITIAL_DELAY, DELAY, TimeUnit.SECONDS);
            } catch (Exception e) {
                LOG.error("error" + e);
            }
        }
    
        public final static ScheduledExecutorService getInstance() {
            return instance;
        }
    }
    

    当您计划一个操作时,当异常发生时,您不会得到反馈。相反,它将停止执行它:

    : …如果任务的任何执行遇到异常,则会抑制后续执行

    因此,您必须在操作本身中使用
    try…catch
    块来报告它,例如在定义
    Runnable
    的lambda表达式中:

    Runnable task = () -> {
        try { UI.getCurrent().access(…); }
        catch (Exception e) { LOG.error("error" + e); }
    };
    

    在我看来,您正在从非UI线程调用
    UI.getCurrent()
    ,我怀疑该线程返回
    null
    ,在尝试对其调用方法时导致
    NullPointerException

    没有抱怨。。我希望看到消息“网格已自动刷新”和我的网格刷新,但我没有预期的行为。所以我不明白我做错了什么,因为,我没有任何错误消息…@Holger,我编辑了我的帖子,更清楚了吗?谢谢你的帮助!我尝试对ScheduledExecutorService使用try/catch(请参阅我文章中的EDIT2)。我认为这不好,因为我没有任何错误,仍然没有预期的行为。你是对的!!NPE!谢谢你的帮助!!!你想把它作为答案吗?我可以结束这篇文章。是的,你完全正确:我不应该调用UI.getCurrent(),我删除了它。我不在UI中。当我调试时,UI.getCurrent()上没有NPE,但NPE显示为Try/Catch再次感谢您的帮助!