Есть ли лучший или альтернативный способ пропустить/избежать использования 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