Multithreading SwingWorker内部的Java EventListener

Multithreading SwingWorker内部的Java EventListener,multithreading,user-interface,serial-port,swingworker,Multithreading,User Interface,Serial Port,Swingworker,好的,我对Java中的SwingWorker有点陌生 我构建了一个JavaGUI,当按下开始按钮时,它会启动几个SwingWorker线程。第一个线程只是跟踪运行时并适当地更新GUI。第二个播放一系列声音文件。第三个也是有问题的线程应该监视串行端口,以便在以后的过程中处理传入的数据。所有这些线程都将运行一段时间,因此它们是Swingworker 我正在使用jSSC库从串行端口读取数据,它通过启动eventListener来实现 我的问题:在SwingWorker线程中编写EventListene

好的,我对Java中的SwingWorker有点陌生

我构建了一个JavaGUI,当按下开始按钮时,它会启动几个SwingWorker线程。第一个线程只是跟踪运行时并适当地更新GUI。第二个播放一系列声音文件。第三个也是有问题的线程应该监视串行端口,以便在以后的过程中处理传入的数据。所有这些线程都将运行一段时间,因此它们是Swingworker

我正在使用jSSC库从串行端口读取数据,它通过启动eventListener来实现

我的问题:在SwingWorker线程中编写EventListener是多余的还是不优雅的?如果是这样,有没有更好的办法

下面是我的一些代码:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

    SerialPort serialPort = findPort(); // returns a serialport I can use to read data from.

    SwingWorker worker1 = new SwingWorker<Void, Void>(){
        @Override
        protected Void doInBackground() throws Exception {
            long elapsedTime, startTime = System.currentTimeMillis();
            while (true){
                Thread.sleep(1000);
                elapsedTime = (System.currentTimeMillis() - startTime)/1000;
                jTimeField.setText(String.format("%02d:%02d:%02d", elapsedTime/3600, (elapsedTime%3600)/60, elapsedTime%60));
                if (isCancelled()){} /* Check if thread has been canceled */
            }
        }
    };

    SwingWorker worker2 = new SwingWorker<Void, Void>(){
        @Override
        protected Void doInBackground() throws Exception {
            // This Thread: Plays music files; Self terminates; On termination also terminates worker 1 and 3 via cancel().
        }
    };

    SwingWorker worker3 = new SwingWorker<Void, Void>(){
        @Override
        protected Void doInBackground() throws Exception {
            serialPort.addEventListener(new SerialPortReader());
            return null;
        }
        class SerialPortReader implements SerialPortEventListener {

            @Override
            public void serialEvent(SerialPortEvent event) {
                byte buffer[];
                if (event.isRXCHAR() && event.getEventValue() > 0){
                    buffer = serialPort.readBytes();
                    for (byte b: buffer){
                        // Do stuff with incoming data
                    }
                }
            }
        }
    };
}

任何和所有建设性的批评都将不胜感激

在swingworker线程中添加事件监听器并在完成后返回没有任何好处。为什么不从EDT添加侦听器,如果处理事件需要很长时间,从那里启动处理线程呢?监听事件不能被阻塞,这将破坏整个观察者模式