【Java】实用小技巧:线程中的函数传递参数

实现方法:

步骤一:因为Thread类创建需要Runnable类型的参数,重新创建一个类实现Runnable接口,重写 里面的run方法,让它具有“接收”参数的办法。

步骤二:在实现类的构造方法中接收一个我们需要被传递参数的参数,同时接收一个Function对象,该对象类似于一个作为参数传递的函数,并把前者所传参数作用于该函数。

话不多说,上代码:

【实现给线程函数传入一个对象参数,并修改该对象参数的值】

import java.util.function.Function;
//让线程函数带着参数传递,实现Runnable接口的类
public class ServerRunnable implements Runnable{
    //定义一个参数是Object,返回值是Object的函数,参数一是参数,参数二是返回值
    private Function<Object,Object> func;
    private Object parameter;//这个是我们传入的参数
    public ServerRunnable(Function<Object, Object> func,Object parameter) {
        this.func = func;
        this.parameter = parameter;
    }
    public Object getParameter() {
        return parameter;
    }
    @Override
    public void run() {
        //运行我们的函数,apply方法就是将函数应用于给定的参数
        if(func != null) func.apply(parameter);
    }
}
public class Test {
    private static class People{
        public int age;
        public People(int age) {
            this.age = age;
        }
    }
    public static void main(String[] args) throws Exception {
        People people = new People(10);//创建一个我们的测试类
        /*
        * 创建我们的线程对象,这里我们传入的是Runnabl的实现类ServerRunnable
        * 参数一是我们要运行的函数,threadObject是该函数的参数名和返回值名,类型是上图定义的Object
        * 参数二是该运行函数运行所要的参数
        * */
        Thread thread = new Thread(new ServerRunnable(
                threadObject -> {
                    People  threadPeople = (People)threadObject;
                    threadPeople.age = 80;
                    return null;
                }, people
        ));
        thread.start();//执行线程
        thread.join();//等待子线程执行完毕后再执行主线程
        System.out.println(people.age);
    }
}

 执行结果:80

多参数传递的方法

1.定义一个List<Object>的集合,把需传递的数据都存放在集合里

2.给Runnable的实现类第二个参数传入List<Object>集合【因为它接收Object类,可传递任意类型参数】

3.在线程函数中分别拿出集合中的数据,转成自己对应类型数据即可。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值