Есть способ общаться между потоками и обмениваться информацией, например, методом получения внутри исполняемого файла, в java

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

Например, если я загружаю изображения в работающий поток, например:

Thread t1 = new Thread(new Runnable(){
    public void run(){
     //Ido the loading here
    }
}

Есть ли способ, которым я могу связаться с этим, например, получить значение переменной:

Thread t1 = new Thread(new Runnable(){
    public void run(){
     //Ido the loading here
name = "dsad";
    }
public void getName(){ return name }
}

но это не работает

Вам необходимо создать тип, у Runnable нет других общедоступных методов или полей, кроме run().

markspace 16.01.2019 03:33
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
69
2

Ответы 2

Вам необходимо создать новый публичный тип. Использование анонимного класса означает, что никакой другой класс не может видеть свои методы, поскольку кроме Runnable нет другого типа, который они могли бы видеть.

public class MyTask implements Runnable(){
    private volatile String name;
    public void run(){
     //I do the loading here
         name = "dsad";
    }
    public void getName(){ return name }
}

это небезопасно, так как name не синхронизируется.

Alex Ding 16.01.2019 04:00

Ключевое слово volatile гарантирует видимость только среди потоков, но не обеспечивает взаимного исключения. Вы уверены, что все модификации String атомарны? Даже с volatile вы можете быть уязвимы для гонок.

scottb 16.01.2019 05:33

String неизменяемы в Java, что гарантирует видимость. Для других объектов семантика видимости Java гарантирует случается раньше для всех записей, сделанных до точки, в которой назначен изменчивый, включая записи, которые объект делает внутренне. Таким образом, пока объект, назначенный name, не подвергается дальнейшим изменениям, он является потокобезопасным. @scottb

markspace 16.01.2019 06:12

Что касается потокового взаимодействия, то есть java.util.concurrent.Exchanger.

В вашем конкретном случае также можно использовать CompletableFuture из Java 8, поскольку Exchanger допускает множественное взаимодействие (оба потока продолжают выполняться), что, возможно, не в вашем случае.

Создание потоков вручную может вызвать различные проблемы:

  • создание потока каждый раз - дорогостоящая операция,
  • создание множества потоков, которые выполняются одновременно, включает в себя возможные проблемы с планировщиком, проблемы с памятью (каждый поток имеет свой собственный стек, ...),
  • публикация значений небезопасным способом (см. разделы «Безопасная публикация» и «Безопасная инициализация») может вызвать гонку данных, что очень плохо

Таким образом, комбинация java.util.concurrent.ExecutorService и java.util.concurrent.CompletableFuture может позволить вам потокобезопасный и легко читаемый способ выполнения асинхронной загрузки.

Использование java.util.concurrent на самом деле является лучшей идеей, но я думаю, что вопрос OP действительно о том, почему добавление общедоступного метода к анонимному классу не «работает», и в основном поэтому я дал ответ, который я сделал.

markspace 16.01.2019 08:53

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

Boozie 16.01.2019 17:04

Другие вопросы по теме

Оптимизация поиска по словарю с помощью dict.items () для большого набора данных
Java рисует круг с помощью awt, JFrame с потоком (Runnable) в Netbeans (Mac)
Параллельное разбиение помеченного множества
Клиент TcpListener остается подключенным, отправляя несколько сообщений, но сервер получает или обрабатывает только первое сообщение
Как я могу запустить цикл while с PyQt5
Почему многопоточная программа на C++ дает сбой, если мы не используем join (), в то время как аналогичная программа на Java не работает
Параллельное умножение векторов с использованием нескольких потоков занимает больше времени, чем последовательное
Установите номер потока или идентификатор группы потоков для свойств в Jmeter
Не удалось лениво инициализировать набор ролей для Map <Integer, String>
Как приостановить основной поток для одновременного выполнения 2 методов, а затем вернуться обратно в основной поток?