Все кадры Swing «замораживаются» при вызове wait () в Java - PullRequest
1 голос
/ 07 октября 2011

Я хочу wait () метод put () , вызываемый из второго потока, который был подключен к Серверу (Монитору). Но когда я делаю это, все фреймы GUI (Swing), включая их элементы, замораживаются после второго вызова put (). Как это исправить? Я хочу, чтобы второй поток продолжал ждать, пока первый поток не выполнит get (), который освобождает слот. Заранее спасибо. Вот мой скелетный код:

Сервер:

Buffer<String> buf = new Buffer<String>(1);
while(true){
   //for each socket connected           
   new ServerHandler(..., buf).start();

}

ServerHandler:

public class ServerHandler extends Thread {

  Buffer<Messenger> buf;

  public void run(){
      buf.put("Test");
  }
}

Buffer:

public class BufferImp<String>
    private String[] requests;
    private int cur_req_in; // current Request in the queue
    private int req_size;
    private int req_count;

 public BufferImp(int size) {
        this.req_size = size;
        requests = new String[size];
        this.cur_req_in = 0;
        this.req_count = 0;
    }

 public synchronized void put(E o) throws InterruptedException {

        while(req_size == req_count) this.wait();

        requests[cur_req_in] = o;
        cur_req_in = (cur_req_in + 1) % req_size;
        req_count++;
        notifyAll();


    }
}

Ответы [ 2 ]

4 голосов
/ 07 октября 2011

Это происходит, если вы ждете () в потоке AWT-EventQueue. Вы никогда не должны ждать там (никакие новые события не могут быть обработаны и графические фреймы). Вместо этого используйте SwingWorker, который ожидает ответа.

-> http://download.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html

3 голосов
/ 07 октября 2011

Не вызывайте wait, когда код выполняется в потоке диспетчеризации событий.

Вместо этого вам нужно создать отдельный поток для вашей длительной задачи,

Читать раздел из Swingучебник по Параллелизм для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...