延迟后在EDT上运行

时间:2019-01-31 11:26:40

标签: java swing event-dispatch-thread

我想在指定的超时后关闭对话框。到目前为止,我有以下方法:

public static void addTimeout(final Component c, long timeout) {
    Timer t = new Timer(c.getName() + "-TimeoutTimer");
    t.schedule(new TimerTask() {
        @Override
        public void run() {
            if (c.isVisible()) {
                SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        c.setVisible(false);
                    }
                });
            }
        }
    }, timeout);
}

但是,我想知道是否有一种更紧凑的编写方式。例如,避免设置计时器,仅调用方法以指定的延迟在EDT上运行代码。有可能吗?

1 个答案:

答案 0 :(得分:1)

不是。如果您转而使用(更现代的)java.util.concurrent处理方式,则可以使用两个lambda并按以下方式进行操作:

public static void addTimeout(final Component c, long timeout) {
    Executors.newSingleThreadScheduledExecutor().schedule(() -> {
        if (c.isVisible()) {
            SwingUtilities.invokeLater(() -> {
                c.setVisible(false);
            });
        }
        return null;
    }, timeout, TimeUnit.MILLISECONDS);
}

...更紧凑。但是,除了切换到预定的线程执行器之外,它实际上只是上面内容的语法糖。

(注意:如果实际使用上面的代码,最好将Executors.newSingleThreadScheduledExecutor()的结果存储起来以备将来调用。)