运行 美国东部时间延迟后
Run on EDT after delay
我想在指定的超时后关闭对话框。到目前为止,我有以下方法:
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 上调用 运行 代码的方法。这可能吗?
不是真的。如果你切换到使用(更现代的)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()
的结果以供将来调用。)
我想在指定的超时后关闭对话框。到目前为止,我有以下方法:
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 上调用 运行 代码的方法。这可能吗?
不是真的。如果你切换到使用(更现代的)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()
的结果以供将来调用。)