Есть ли лучший или альтернативный способ пропустить/избежать использования Thread.sleep(1000) в Java?

Я тестировал тяжело загруженное видео, которое загружает видео и после Thread.sleep(1000); он воспроизводит второе видео. Но как только я играю один за другим в цикле, он замирает.

Когда я удалил все те 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);
      } 
    }
} 

Ответы

Ответ 1

Если вы вызываете sleep() в поток обработки событий, то да, ваш графический интерфейс будет зависеть в течение этого времени. Лучше всего использовать SwingTimer, который позволит вам запускать воспроизведение второго видео после заданной задержки без вызова sleep().

Ответ 2

как упоминалось выше, SwingTimer является хорошим решением

если вы хотите, чтобы это немного сложнее, но самодельное начало новой Thread для обработки сна и новых нагрузок. но я бы предпочел тоже SwingTimer