实现方法:
步骤一:因为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.在线程函数中分别拿出集合中的数据,转成自己对应类型数据即可。