Java サブスレッドはどのようにメインスレッドの変数にアクセスできますか?

子のスレッドは親スレッドの変数には、直接アクセスできません。各スレッドは、スレッドごとのスタック領域を持ち、そこにはスレッドのローカル変数やメソッドのコールスタックなどが格納されています。親スレッドと子スレッドは別個のスレッドであり、各スレッドのスタック領域は互いに独立しています。

ワーカースレッドからメイントレッドの変数にアクセスする必要がある場合は、以下の方法を使用できます。

  1. 親スレッドの変数を、サブスレッドのコンストラクタやメソッドにパラメータとして渡すことができます。
public class MainThread {
    public static void main(String[] args) {
        int mainThreadVariable = 10;
        
        // 创建子线程,并将主线程的变量作为参数传递
        Thread childThread = new Thread(new ChildThread(mainThreadVariable));
        childThread.start();
    }
}

public class ChildThread implements Runnable {
    private int mainThreadVariable;
    
    public ChildThread(int mainThreadVariable) {
        this.mainThreadVariable = mainThreadVariable;
    }
    
    @Override
    public void run() {
        // 在子线程中访问主线程的变量
        System.out.println("Main thread variable: " + mainThreadVariable);
    }
}
  1. スレッドローカル
  2. スレッド ローカル
public class MainThread {
    // 创建一个ThreadLocal对象,存储主线程的变量
    private static ThreadLocal<Integer> mainThreadVariable = new ThreadLocal<>();
    
    public static void main(String[] args) {
        mainThreadVariable.set(10);
        
        // 创建子线程
        Thread childThread = new Thread(new Runnable() {
            @Override
            public void run() {
                // 在子线程中访问主线程的变量
                System.out.println("Main thread variable: " + mainThreadVariable.get());
            }
        });
        childThread.start();
    }
}
  1. 結合する
  2. 結合
  3. ジョイン()
public class MainThread {
    private static int mainThreadVariable;
    
    public static void main(String[] args) throws InterruptedException {
        Thread childThread = new Thread(new Runnable() {
            @Override
            public void run() {
                // 修改主线程的变量
                mainThreadVariable = 10;
            }
        });
        childThread.start();
        
        // 等待子线程执行完毕
        childThread.join();
        
        // 在主线程中访问修改后的变量
        System.out.println("Main thread variable: " + mainThreadVariable);
    }
}

いずれの方法でも、子スレッドによる親スレッド変数の参照や変更が可能ですが、マルチスレッドプログラミングでは、共有変数の参照で競合状態やスレッドセーフの問題が発生する可能性があり、データの一貫性と正確性を確保するために適切な同期操作を行う必要があります。

bannerAds