我在我的应用程序中使用java swing。下面是我的代码。但是我知道Thread.sleep()
不应该与波动一起使用。我阅读了一些帖子,说明要使用来自Timer
的{{1}}但是对于下面的代码,我不知道如何实现它。
javax.swing.timer
如何实现与睡眠相同的行为?
编辑:
public void mouseClicked(MouseEvent e) {
try{
demo.main("Welcome");
Thread.sleep(900);
demo.main("Argument to main");
Thread.sleep(900);
demo.main("Argument to main");
// after this I call a method say `xyz` which also uses Thread.sleep()
// and this `xyz` method uses variables that are updated in `demo.main()`
}catch(Exception e){
e.printStackTrace();
}
不会更新GUI,但demo.main()
会更新GUI
变量在xyz()
demo.main()
,一分钟后我想在一分钟后再次调用它。在完成此操作后,我想调用另一个方法demo.main()
,该方法也使用xyz()
并使用thread.sleep()
答案 0 :(得分:1)
我会使用ScheduledExecutorService
和有序的操作列表。使用enum
对此有好处。然后,此enum
可以实现简单的功能interface
。
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
enum ClickAction {
Action1(900) {
@Override
void execute() {
message("Welcome");
}
},
Action2(900) {
@Override
void execute() {
message("Another message");
}
};
private final int delayAfter;
private ClickAction(int delayAfter) {
this.delayAfter = delayAfter;
}
abstract void execute();
}
private static void message(String msg) {
System.out.println("msg=" + msg);
}
public void mouseClicked(MouseEvent e) {
int delay = 0;
for (ClickAction action : ClickAction.values()) {
// Schedule it.
executor.schedule(() -> {
action.execute();
}, delay, TimeUnit.MILLISECONDS);
// Add up all of the delays.
delay += action.delayAfter;
}
}
答案 1 :(得分:0)
我会简单地产生一个新线程,例如(最简单的例子)
Thread t = new Thread(new Runnable() {
public void run() {
demo.main("Welcome");
Thread.sleep(900);
demo.main("Argument to main");
Thread.sleep(900);
demo.main("Argument to main");
}
});
t.start();
因为您不想阻止Swing更新线程(正如您所指出的那样)。以上将在后台线程中调用您的demo
类。我可能会调查Java multithreading further - 如果您有更复杂的要求,您可能希望使用比此处提供的简单Thread
对象更高级别的构造。
答案 2 :(得分:0)
CountDownLatch
可以做你想做的事。
例如:
public void mouseClicked(MouseEvent e) {
try{
final CountDownLatch latch = new CountDownLatch(1);
demo.main("Welcome", latch);
latch.await();
}catch(Exception e){
e.printStackTrace();
}
}
然后在主要部分,你会致电latch.countDown()
继续等待。