在java中,这是一种线程间通信和交换信息的方法,就像runnable中的getter方法一样吗

在java中,这是一种线程间通信和交换信息的方法,就像runnable中的getter方法一样吗,java,multithreading,Java,Multithreading,在不同的线程中更新getter变量时,是否有一种在线程之间进行通信的方法 例如,如果im在可运行线程中加载图像,如下所示: Thread t1 = new Thread(new Runnable(){ public void run(){ //Ido the loading here } } 是否有一种方法可以与之沟通,比如获取var的值,例如: Thread t1 = new Thread(new Runnable(){ public void run(){

在不同的线程中更新getter变量时,是否有一种在线程之间进行通信的方法

例如,如果im在可运行线程中加载图像,如下所示:

Thread t1 = new Thread(new Runnable(){
    public void run(){
     //Ido the loading here
    }
}
是否有一种方法可以与之沟通,比如获取var的值,例如:

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 }
}

至于线程通信,有
java.util.concurrent.Exchanger

在您的特定情况下,也可以使用来自Java8的CompletableFuture,因为交换器允许多个通信(两个线程都继续执行),这可能不是您的情况

手动创建线程可能会导致不同的问题:

  • 每次创建线程都是昂贵的操作
  • 创建大量同时运行的线程可能涉及调度程序问题、内存问题(每个线程都有自己的堆栈,…)
  • 以不安全的方式发布值(请参阅安全发布和安全初始化主题)可能会导致数据争用,这非常糟糕

因此,
java.util.concurrent.ExecutorService
java.util.concurrent.CompletableFuture
的组合可能允许您以线程安全且易于阅读的方式执行异步加载。

您需要创建一个类型,
Runnable
除了
run()之外没有其他公共方法或字段
。这是不安全的,因为
name
未同步。
volatile
关键字只保证线程之间的可见性,但不提供互斥。您确定对
字符串的所有修改都是原子的吗?即使使用
volatile
,您也可能容易受到种族攻击。字符串在Java中是不可变的,这保证了可见性。对于其他对象,Java的可见性语义保证发生在所有写入操作(包括对象内部写入操作)之前,直到指定volatile为止。因此,只要分配给
name
的对象没有被进一步修改,它就是线程安全的@scottbUsing
java.util.concurrent
实际上是一个更好的主意,但我认为OP的问题实际上是为什么向匿名类添加公共方法不“起作用”,这就是我给出答案的基本原因。是的,但我也希望有人能分享线程之间通信的方法。