Прежде всего: извините за короткий ответ, не слишком много времени, чтобы сэкономить.
У меня была такая же проблема: желание опубликовать на System.out
изнутри рабочего.
Краткий ответ: Оно не заблокирует ваше приложение, если вы используете метод execute()
Дело в том, что блокировка не выполняется, если вы выполняете рабочий в порядке: фоновая задача.
class MyWorker extend SwingWorker<Void, Void>{
@Override
protected Void doInBackground() throws ... {
// your logic here and a message to a stream
System.out.println("from my worker, with love");
// ...
try {
throw new Exception("Whoops, this is an exception from within the worker");
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
Теперь вы будете вызывать этого работника, создавая новый экземпляр, а после этого вызывать метод execute()
. Но чтобы сэкономить ваше время: вы, вероятно, захотите узнать, когда ваш работник закончил, поэтому вам нужно зарегистрировать прослушиватель изменения свойства, что довольно просто:
class MyListener implements PropertyChangeListener{
@Override
public void propertyChange(PropertyChangeEvent evt){
if(evt.getPropertyName().equals("state") && evt.getNewValue().equals(SwingWorker.StateValue.DONE)){
System.out.println("The worker is done");
}
}
}
И собрать все вместе на вашем main()
:
public void main(...){
MyWorker w = new MyWorker();
MyListener l = new MyListener();
w.addPropertyChangeListener(l);
w.execute();
}