Получить Gui Console, чтобы игнорировать latch.await () - PullRequest
0 голосов
/ 09 декабря 2011

У меня есть приложение, которое перенаправляет мой текст System.out в Jtextarea. Это прекрасно работает, но когда я вызываю один из методов в моем приложении, он создает несколько потоков и использует счетчик защелок, чтобы дождаться их завершения. Затем этот метод вызывает latch.await (), чтобы он не завершил выполнение своего кода, пока не закончатся другие потоки. Проблема в том, что после вызова кода latch.await () мой JtextArea перестает публиковать текст, пока все потоки не завершатся. Есть идеи по этому поводу? Консоль Eclipse может продолжать публиковать сообщения во время работы latch.await (), поэтому это должно быть возможно.

Пример: Из графического интерфейса:

btnStart.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
System.out.println("You pressed Start");
MyGoogleSearch startParsing = new MyGoogleSearch();
try {
startParsing.startParser(othoSelection); ...

MyGoogleSearch:

Enumeration e = hm.elements();



    //Read in src/Ontology/Ontology.txt
    //Put each line into the searchQuery ArrayQueue
        while ((strLine = br.readLine()) != null)   
        {  
            searchQuery.put(strLine);
        }
        System.out.println("Finsihed loading");

        //Create 32 threads (More threads allows you to pull data from Bing faster.  Any more than 32 and Bing errors out (you start to pull data
        //too fast)
            for(int i = 0; i < 32; i++)
            {
                System.out.println("Starting thread: " + i);
                new NewThread();
            }

    //Wait for all of the threads to finish
    latch.await();
    e = hm.keys();

    //Write the URL's from the hashmap to a file
        while (e.hasMoreElements())
        {
            out.write(e.nextElement() + "\n");
        }

        //close input/output stream
        in.close();
        out.close();
        System.out.println("Done");

и поток делает кое-что потом

MyGoogleSearch.latch.countDown();

1 Ответ

0 голосов
/ 09 декабря 2011

Это прекрасно работает, но когда я вызываю один из методов в моем приложении, он создает несколько потоков и использует счетчик защелок, чтобы дождаться их завершения.

Вы можете обойти это, вызвав метод в отдельном потоке. Однако я подозреваю, что метод ожидает завершения всех потоков, потому что он хочет агрегировать некоторые результаты и затем возвращать агрегированный результат (или что-то подобное). Если это так, то есть несколько способов справиться с этим, но, вероятно, наиболее разумным для графического приложения является то, чтобы поток вызывал обратный вызов с любыми результатами, полученными с помощью метода.

Если вы разместите пример кода, мы можем предоставить вам более конкретные ответы и примеры того, как это сделать.

Обновление:

Мне трудно читать ваш код, но я предполагаю, что 'startParser' - это блокирующий вызов. Кроме того, похоже, что пользовательскому интерфейсу не нужно ждать результатов, поэтому я бы порекомендовал вам сделать самую простую вещь:

MyGoogleSearch startParsing = new MyGoogleSearch();

Thread t = new Thread(new Runnable(){
    public void run(){
        startParsing.startParser(othoSelection);
    }
}

// don't wait for this thread to finish
t.start();
...