有没有更好的或替代的方法来跳过/避免在Java中使用Thread.sleep(1000)?

我正在测试一个重载video,它加载video并在Thread.sleep(1000)之后; 它播放第二个video。 但是一旦我在循环中一个接一个地玩,它就会冻结。

当我删除所有Thread.sleep(1000); 它完美无故地工作。

但我需要延迟(但不使用Thread.sleep方法),我们怎么做呢?

package test; public class Test { static String what = "0"; public static void main(String args[]) { Load.video720p("/tmp/START.mp4"); // This is 8 second movie playing new javax.swing.Timer(8000, new ActionListener() { public void actionPerformed(ActionEvent ae) { if (what.equals("0") ) { /* After 8 seconds play 0.mp4 */ callMe(); what = "1"; } else { /* After 8 seconds play 1.mp4 */ callMe(); what = "0"; } } }).start(); /* Keep on looping every 8 seconds. */ } /* 8 seconds interval call me. */ public static void callMe() { try { /* Try 0: Freeze/Do not play */ Load.video720p("/tmp/" + what + ".mp4"); /* Try 1: Does not change films (cant run) new Thread(new Runnable() { public void run() { Load.video720p("/tmp/" + what + ".mp4", EVENT_TRIGGER_TRUE); } });*/ /* Try 2: Fails try { javax.swing.SwingUtilities.invokeAndWait(new Runnable() { public void run() { Load.video720p("/tmp/" + what + ".mp4"); } }); } catch (Exception e) { System.err.println(e); }*/ /* Try 3: Failes try { java.awt.EventQueue.invokeAndWait(new Runnable() { public void run() { Load.video720p("/tmp/" + what + ".mp4"); } }); } catch (Exception e) { System.err.println(e); }*/ } catch (Exception e) { System.out.println(e); } } } 

如果你在事件处理线程上调用sleep() ,那么是的,你的GUI将在那段时间内冻结。 更好的想法是使用SwingTimer ,它允许您在指定的延迟后触发播放第二个video而不调用sleep()

如上所述,SwingTimer是一个很好的解决方案

如果你想要它更复杂但是自制的启动一个新的线程来处理睡眠和新的负载。 但我也更喜欢SwingTimer