多个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同步的计时器,那将非常有帮助。我应该把它变成一个新问题吗?。