Есть ли способ общаться между потоками, например получать переменные с геттерами, поскольку они обновляются в другом потоке
Например, если я загружаю изображения в работающий поток, например:
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 нет другого типа, который они могли бы видеть.
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 не синхронизируется.
Ключевое слово volatile гарантирует видимость только среди потоков, но не обеспечивает взаимного исключения. Вы уверены, что все модификации String атомарны? Даже с volatile вы можете быть уязвимы для гонок.
String неизменяемы в Java, что гарантирует видимость. Для других объектов семантика видимости Java гарантирует случается раньше для всех записей, сделанных до точки, в которой назначен изменчивый, включая записи, которые объект делает внутренне. Таким образом, пока объект, назначенный name, не подвергается дальнейшим изменениям, он является потокобезопасным. @scottb
Что касается потокового взаимодействия, то есть java.util.concurrent.Exchanger.
В вашем конкретном случае также можно использовать CompletableFuture из Java 8, поскольку Exchanger допускает множественное взаимодействие (оба потока продолжают выполняться), что, возможно, не в вашем случае.
Создание потоков вручную может вызвать различные проблемы:
Таким образом, комбинация java.util.concurrent.ExecutorService и java.util.concurrent.CompletableFuture может позволить вам потокобезопасный и легко читаемый способ выполнения асинхронной загрузки.
Использование java.util.concurrent на самом деле является лучшей идеей, но я думаю, что вопрос OP действительно о том, почему добавление общедоступного метода к анонимному классу не «работает», и в основном поэтому я дал ответ, который я сделал.
правда, но я хотел бы, чтобы кто-нибудь также поделился методом общения между потоками.
Вам необходимо создать тип, у
Runnableнет других общедоступных методов или полей, кромеrun().