Как ждать LinkedBlockingQueue, чтобы получить результаты от потоков? - PullRequest
0 голосов
/ 19 ноября 2018

Я реализовал класс, в котором LinkedBlockingQueue используется для хранения названия города. Это пример кода:

Executors класс используется для порождения потоков.

В основном методе

LinkedBlockingQueue<String> countryCities= new LinkedBlockingQueue<String>();
......
........//Some code that initially inserts into queue

ExecutorService exe = Executors.newFixedThreadPool(30);
while(!countryCities.isEmpty())
        {
                emp=countryCities.take().getValue();        
                GetStatus stat=new GetStatus (country);
                exe.execute(stat);

        }

        exe.shutdown();

В классе GetStatus :

public class GetStatus implements Runnable
{

  LinkedBlockingQueue<String> countryCities;

  public GetStatus (LinkedBlockingQueue<String> countryCities)
  {
     this.countryCities=countryCities;
  }
@Override
    public void run() 
   {

            GetMoreInfo();

    }

public void GetMoreInfo()
   {
      String cities = ......
       ........ // Some processing to get cities
      countryCities.put(cities);
   }
}

Проблема в том, что после выполнения цикла while метод main прерывается, поскольку он не получает обновленный countryCities в LinkedBlockingQueue из main. Поскольку поток работает независимо, метод run вызывается только в первой итерации после смерти основного потока.

Это не то поведение, которого я ожидаю. Я ожидал, что countryCities в main будет обновлено некоторыми "городами".

Можно ли как-нибудь получить очередь в main, чтобы дождаться результата от GetStatus.GetMoreInfo()?

Я знаю, что я мог бы сделать что-то действительно неправильное в реализации многопоточности. Но простите меня за это, так как я впервые это делаю:)

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