java中如何从主线程传参数到子线程

本文通过一个Java示例展示了子线程如何等待主线程结束,同时介绍了如何从主线程向子线程传递参数。示例代码中,子线程通过调用主线程的join()方法来实现等待,并在主线程中断时做出响应。

下面这个例子和上面一样,除了说是子线程要join主线程。本例中还教会了大家,如何从主线程传参数到子线程。

例:1.5.3_2

class ThreadMark_to_win extends Thread {
    Thread mainT;
    Test t;
    public void run() {
        try {
            mainT.join();
        } catch (InterruptedException e) {
            System.out.println("我是子程序, 也被打断");
            
        }
        System.out.println("完成"+"e 在子线程"+t.e);
    }
    public void setMainThread(Thread t1, Test tTest) {
        mainT=t1;
        t=tTest;
    }
}
public class Test {
    int e;
    public static void main(String[] args) {
        Test t=new Test();
        Thread mainT = Thread.currentThread();
        ThreadMark_to_win tm = new ThreadMark_to_win();
        tm.setMainThread(mainT,t);
        tm.start();
        for (int i = 0; i < 10; i++)
        {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
            if(i==4) tm.interrupt(); 
            t.e = t.e + i;
        }
        System.out.println("主线程e = " + t.e);
    }
}

更多请见:https://blog.youkuaiyun.com/qq_43650923/article/details/101215957

### 在 Java 中从主线程向其他线程参数的方法 在 Java 编程语言中,有多种方式可以从主线程向新创建的子线程递数据。以下是几种常见的方式: #### 使用构造函数参数 当通过继承 `Thread` 类或者实现 `Runnable` 接口来定义一个新的线程类时,在该自定义线程类里可以设置带参构造方法接收来自外部的数据。 ```java class MyTask implements Runnable { private final int taskId; public MyTask(int id) { // 构造器接受参数 this.taskId = id; } @Override public void run() { System.out.println("Executing Task ID:" + taskId); } } ``` 启动线程并参数: ```java MyTask task = new MyTask(1); // 创建实例的同时赋值给taskId成员变量 new Thread(task).start(); // 启动新的线程执行run方法中的逻辑 ``` 这种方法简单明了,适用于只需要一次性的初始化配置场景[^2]。 #### 利用匿名内部类或Lambda表达式的局部变量捕获特性 对于简单的应用场景可以直接在线程创建处利用匿名内部类或者是更简洁的 Lambda 表达式形式完成参数递工作。需要注意的是所使用的局部变量必须是有效的最终变量(final 或者实际上不可变)[^2]。 ```java int valueToPass = 42; // 使用匿名内部类 new Thread(new Runnable(){ @Override public void run(){ System.out.println(valueToPass * 2); } }).start(); // 或者使用lambda表达式简化写法 new Thread(() -> System.out.println(valueToPass * 3)).start(); ``` 此方案适合于临时性和较为简单的任务处理场合下快速构建和运行带有少量输入信息的任务单元。 #### 借助共享对象作为媒介间接输数据 还可以考虑设计一个专门用于承载待交换的信息的对象结构体,让多个线程之间能够围绕着这个公共载体来进行协作交流活动。这种方式灵活性较高但也容易引发同步竞争等问题所以要谨慎对待并发访问控制方面的要求。 ```java class SharedDataHolder { volatile Integer sharedValue; // 变量声明加上volatile关键字确保可见性 synchronized void setSharedValue(Integer newValue){ sharedValue = newValue; } synchronized Integer getSharedValue(){ return sharedValue; } } public class Main { public static void main(String[] args) throws InterruptedException{ SharedDataHolder holder = new SharedDataHolder(); Thread t = new Thread(() -> { while(holder.getSharedValue()==null){ /* wait */ } System.out.println("Received Value:"+holder.getSharedValue()); }); t.start(); TimeUnit.SECONDS.sleep(1L); // 模拟延迟 holder.setSharedValue(888); } } ``` 上述三种途径各有优劣之处,具体选用哪一种取决于实际开发需求以及项目架构特点等因素综合考量的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mark_to_win

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值