Multithreading SwingWorker内部的Java EventListener
好的,我对Java中的SwingWorker有点陌生 我构建了一个JavaGUI,当按下开始按钮时,它会启动几个SwingWorker线程。第一个线程只是跟踪运行时并适当地更新GUI。第二个播放一系列声音文件。第三个也是有问题的线程应该监视串行端口,以便在以后的过程中处理传入的数据。所有这些线程都将运行一段时间,因此它们是Swingworker 我正在使用jSSC库从串行端口读取数据,它通过启动eventListener来实现 我的问题:在SwingWorker线程中编写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
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添加侦听器,如果处理事件需要很长时间,从那里启动处理线程呢?监听事件不能被阻塞,这将破坏整个观察者模式