Я реализовал класс, в котором 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()
?
Я знаю, что я мог бы сделать что-то действительно неправильное в реализации многопоточности. Но простите меня за это, так как я впервые это делаю:)