父子线程之间怎么共享/传递数据?

当我们在同一个线程中,想要共享变量的话,是可以直接使用ThreadLocal的,但是如果在父子线程之间,共享变量,ThreadLocal就不行了。

如以下代码,会抛出NPE:

public static ThreadLocal<Integer> sharedData = new ThreadLocal<>();


public static void main(String[] args) {
    sharedData.set(0);
    MyThread thread = new MyThread();
    thread.start();
    sharedData.set(sharedData.get() + 1);
    System.out.println("sharedData in main thread: " + sharedData.get());

}

static class MyThread extends Thread {

    @Override
    public void run() {
        System.out.println("sharedData in child thread: " + sharedData.get());
        sharedData.set(sharedData.get() + 1);
        System.out.println("sharedData in child thread after increment: " + sharedData.get());
    }
}

因为ThreadLocal 变量是为每个线程提供了独立的副本,因此不同线程之间只能访问它们自己的副本。

那么,想要实现数据共享,主要有两个办法,第一个是自己传递,第二个是借助InheritableThreadLocal

自己传递

我们可以在子线程中创建一个成员变量,这样在主线程创建子线程的时候,可以给成员变量赋值,这样实现数据共享。

import java.util.concurrent.ConcurrentHashMap;

public class SharedDataExample {
   public static void main(String[] args) {
      ConcurrentHashMap<String, String> sharedData = new ConcurrentHashMap<String, String>();
      MyThread thread = new MyThread(sharedData);
      thread.start();
      sharedData.put("key", "value");
      System.out.println("sharedData in main thread: " + sharedData.get("key"));
   }
}

class MyThread extends Thread {
   ConcurrentHashMap<String, String> sharedData;
   public MyThread(ConcurrentHashMap<String, String> data) {
      this.sharedData = data;
   }
   public void run() {
      sharedData.put("key", "new value");
      System.out.println("sharedData in child thread: " + sharedData.get("key"));
   }
}

但是一定要考虑线程安全的问题。

InheritableThreadLocal

与 ThreadLocal 不同,InheritableThreadLocal 可以在子线程中继承父线程中的值。在创建子线程时,子线程将复制父线程中的 InheritableThreadLocal 变量。

我们把开头的示例中ThreadLocal改成InheritableThreadLocal就可以了:

public static InheritableThreadLocal<Integer> sharedData = new InheritableThreadLocal<>();


    public static void main(String[] args) {
        sharedData.set(0);
        MyThread thread = new MyThread();
        thread.start();
        sharedData.set(sharedData.get() + 1);
        System.out.println("sharedData in main thread: " + sharedData.get());

    }

    static class MyThread extends Thread {

        @Override
        public void run() {
            System.out.println("sharedData in child thread: " + sharedData.get());
            sharedData.set(sharedData.get() + 1);
            System.out.println("sharedData in child thread after increment: " + sharedData.get());
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值