Возможный дубликат: need-help-returning-object-in-thread-run-method
Здравствуйте. У меня есть класс, реализующий выполнимый, и у меня есть Список, храня Потоки, которые инстанцируют с различными объектами того класса. Как я могу получить доступ к свойствам основных объектов, учитывая объект потока выполнение их? Вот пример:
public class SO {
public static class TestRunnable implements Runnable {
public String foo = "hello";
public void run() {
foo = "world";
}
}
public static void main(String[] args) {
Thread t = new Thread(new TestRunnable());
t.start();
//How can I get the value of `foo` here?
}
}
Я не вижу способа сделать это в документации java.lang.Thread
.
Мой лучший ответ: вероятно, вам следует использовать List
вместо (или в дополнение к) List
. Или, возможно, вам нужна какая-то структура map , чтобы вы могли получить доступ к Runnable из потока. (Например, java.util.HashMap
)
Библиотека параллелизма хорошо это поддерживает. Примечание. Если ваша задача генерирует исключение, Future будет удерживать это и генерировать исключение упаковки, когда вы вызываете get ()
ExecutorService executor = Executors.newSingleThreadedExecutor();
Future<String> future = executor.submit(new Callable<String>() {
public String call() {
return "world";
}
});
String result = future.get();
TestRunnable r = new TestRunnable();
Thread t = new Thread(r);
t.start();
//there you need to wait until thread is finished, or just a simple Thread.sleep(1000); at this case
System.out.println(r.foo);
Кстати, на самом деле вам нужно использовать Callable
и FutureTask
Если вы хотите вернуть значение асинхронного вычисления, посмотрите Callable и FutureTask:
FutureTask<String> task = new FutureTask(new Callable<String>() {
public String call() {
return "world";
}
});
new Thread(task).start();
String result = task.get();
Вот как вы можете реализовать это напрямую.
public static void main(String[] args) {
// Keep a reference to the runnable object for later ...
TestRunnable r = new TestRunnable();
Thread t = new Thread(r);
t.start();
// Wait until the child thread has finished
t.join();
// Pull the result out of the runnable.
System.out.println(r.foo);
}
Однако современный (менее подверженный ошибкам) способ делать такие вещи - использовать классы параллелизма более высокого уровня из java.util.concurrent
.