Ваши SwingWorkers выполняются в вашей ветке SwingWorker. Поэтому, когда вы видите
Кажется, он зависает на sw2.get (), и в jdk7 есть только один поток с именем Swingworker. На jdk6 вижу сразу 3-5. - кд304
Это связано с тем, что класс SwingWorker является не потоком, а задачей, выполняемой в потоке, и конфигурация по умолчанию для ExecutorService для SwingWorker в Java 6 настроена иначе, чем в Java 7. IE ваш SwingWorkerExecutorService ( который определен внутри класса SwingWorker) имеет другое значение для максимального количества потоков, выделяемых для задач.
//From Java 6 SwingWorker
private static final int MAX_WORKER_THREADS = 10;
public final void execute() {
getWorkersExecutorService().execute(this);
}
private static synchronized ExecutorService getWorkersExecutorService() {
...
private static synchronized ExecutorService getWorkersExecutorService() {
new ThreadPoolExecutor(0, MAX_WORKER_THREADS,
1L, TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(),
threadFactory)
}
У вас есть только один поток, выполняющий задачи SwingWorker, и эта первая задача ожидает завершения второй задачи, которая не может быть запущена, поскольку поток, в котором будет выполняться вторая задача, ожидает вторую задание завершить, прежде чем оно вернется. Заставить нить зависимого работника зависеть от выполнения другого - верный путь к тупику. Возможно, вы захотите использовать ExecutorService для планирования событий, запускаемых в потоке SwingWorker, и не делать одно запланированное событие зависимым от завершения другого запланированного события.
Java 7 SwingWorker