多个javax.swing.Timer侦听器同步问题,Java
我有两个线程,每个线程设置一个计时器多个javax.swing.Timer侦听器同步问题,Java,java,swing,Java,Swing,我有两个线程,每个线程设置一个计时器 if(threadname.equals(“t1”))timer=newjavax.swing.timer(4000,new TimerListener()); else-timer=newjavax.swing.timer(4000,new-TimerListener2()) 但在不同的初始时间触发(通过按下按钮)。我的目标是在事件处理程序中添加同步,以便计时器首先完成的一个应该等待另一个。下面是一个示例代码,它显示了我的意思 private class
if(threadname.equals(“t1”))timer=newjavax.swing.timer(4000,new TimerListener());
else-timer=newjavax.swing.timer(4000,new-TimerListener2())代码>
但在不同的初始时间触发(通过按下按钮)。我的目标是在事件处理程序中添加同步,以便计时器首先完成的一个应该等待另一个。下面是一个示例代码,它显示了我的意思
private class TimerListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
ta_chat.append("here 1\n");
try {
barrier1.await();
} catch (InterruptedException ex) {
Logger.getLogger(server_frame.class.getName()).log(Level.SEVERE, null, ex);
} catch (BrokenBarrierException ex) {
Logger.getLogger(server_frame.class.getName()).log(Level.SEVERE, null, ex);
}
ta_chat.append("here 2\n");
...
}
}
与TimerListener2代码相同。屏障在main方法中初始化
final CyclicBarrier barrier = new CyclicBarrier(2);
每个线程都引用它
据
虽然所有计时器都使用一个共享的
线程(由执行的第一个计时器对象创建),操作
计时器的事件处理程序在另一个线程上执行
事件调度线程。这意味着
定时器可以安全地对回转组件执行操作。但是,
还意味着处理程序必须快速执行以保持GUI
反应迅速
如果我理解正确,处理程序将在一个线程中序列化运行,上面的代码将导致dedlock。当我测试上述代码时,整个gui系统都冻结了。
我的问题是,是否有办法克服这个问题,或者是否有其他办法来实现我所描述的目标 不使用Swing定时器,它们将从EDT内通知ActionListener,因此执行任何类型的锁定都将防止您收到第二个定时器的通知。也许使用SwingWorker?哦,同样“thread==”t1“不是Java中字符串比较的工作方式谢谢程序员的评论。我只是做了一个关于荡秋千的小调查。因此,如果我理解正确,为了使用SwingWorker创建计时器,我需要两种方法。一种是执行thread.sleep(time)
命令的doInBackround方法,另一种是拥有Timmerlistener所有命令的done()方法。我尝试使用SwingWorker创建计时器,但它再次冻结。如果有人能举例说明如何使用SwingWorker制作一个接受CyclicBarrier同步的计时器,那将非常有帮助。我应该把它变成一个新问题吗?。