Вы не возвращаете нить качания должным образом. Я понимаю, что вы используете callable / runnable, но я предполагаю, что вы делаете это неправильно (хотя вы не опубликовали достаточно кода, чтобы знать наверняка).
Базовая структура будет:
swingMethod() { // Okay, this is a button callback, we now own the swing thread
Thread t=new Thread(new ActuallyDoStuff());
t.start();
}
public class ActuallyDoStuff() implements Runnable {
public void run() {
// this is where you actually do the work
}
}
Это просто не в моей голове, но я предполагаю, что вы либо не делаете thread.start, а вместо этого вызываете метод run напрямую, либо вы делаете что-то еще в первом блокирующем методе это (как thread.join). Ни один из них не освободит качающуюся нить. Первый метод ДОЛЖЕН возвращаться быстро, метод run () может занять столько времени, сколько ему нужно.
Если вы выполняете thread.join в первом методе, то поток НЕ возвращается в систему!
Редактировать: (фактически второе редактирование)
Я думаю, чтобы поговорить с проблемой, которую вы на самом деле чувствуете - вы можете подумать о системе модель / представление / контроллер. Код, который вы пишете, является контроллером (представление обычно считается компонентами на экране - представление / контроллер обычно очень тесно связаны).
Когда ваш контроллер получает событие, он должен передать работу вашей модели. Вид тогда из картинки. Это не ждет модель, это просто сделано.
Когда ваша модель закончена, она должна затем сказать контроллеру сделать что-то еще. Это делается с помощью одного из методов вызова. Это передает управление обратно контроллеру, и вы продолжаете свой веселый путь. Если вы думаете об этом таким образом, разделять контроль и преднамеренно передавать его назад и вперед не кажется таким громоздким, и на самом деле это очень распространено.