Как получить доступ к Выполнимому объекту Потоком?

Возможный дубликат: 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?
    }
}

24
задан Community 23 May 2017 в 11:45
поделиться

5 ответов

Я не вижу способа сделать это в документации java.lang.Thread .

Мой лучший ответ: вероятно, вам следует использовать List вместо (или в дополнение к) List . Или, возможно, вам нужна какая-то структура map , чтобы вы могли получить доступ к Runnable из потока. (Например, java.util.HashMap )

13
ответ дан 28 November 2019 в 23:44
поделиться

Библиотека параллелизма хорошо это поддерживает. Примечание. Если ваша задача генерирует исключение, Future будет удерживать это и генерировать исключение упаковки, когда вы вызываете get ()

ExecutorService executor = Executors.newSingleThreadedExecutor();

Future<String> future = executor.submit(new Callable<String>() { 
   public String call() { 
      return "world"; 
   } 
}); 

String result = future.get(); 
10
ответ дан 28 November 2019 в 23:44
поделиться
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

4
ответ дан 28 November 2019 в 23:44
поделиться

Если вы хотите вернуть значение асинхронного вычисления, посмотрите Callable и FutureTask:

FutureTask<String> task = new FutureTask(new Callable<String>() {
   public String call() {
      return "world";
   }
});
new Thread(task).start();
String result = task.get();
4
ответ дан 28 November 2019 в 23:44
поделиться

Вот как вы можете реализовать это напрямую.

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 .

1
ответ дан 28 November 2019 в 23:44
поделиться