java runnable线程如何传参?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java runnable线程如何传参?相关的知识,希望对你有一定的参考价值。

Thread thread2=new Thread(new ThreadUseRunnable(),"SecondThread");
"SecondThread"是参数传递下去吗|?run()如何获取到这个值?
请提示或举例Runnable的参数是使用方法

Runnable里面没有传参函数,所以得自己造一个

0.自定义一个接口,继承Runnable,新增一个传参方法

public interface MyRunnable extends Runnable
   public MyRunnable setParam(String... param);

    实现这个自定义接口

MyRunnable sendMessage = new MyRunnable() 
    String message;
    @Override
    public MyRunnable setParam(String... param) 
        message = param[0];
        return this;
    

    @Override
    public void run() 
        sendMessage(message);
    
;

2.初始化线程池,运行Runnable

 ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
 cachedThreadPool.execute(sendMessage.setParam("I am service"));

如上所示,线程池调用的一个runnable实例,这个runnable实例传入了一个字符串参数

参考技术A "SecondThread" 是新new的线程的名字,可以通过getName()方法拿到这个线程的名字追问

线程中需要用到线程外面的一个字符串 如何传呢。

追答

得看是什么类型的字符串,是字符串常量呢,还是某个方法的返回值呢,还是什么

追问

string 某个方法的返回值

追答

方法是静态的还是非静态的呢,如果是静态的可以直接在run()方法里调用这个方法,然后把返回值保存下来,如果是非静态的可能需要拿到这个对象的引用了。

追问

非静态的方法如何弄?
这个方法的返回值如何作为线程的参数并能取到?

追答

首先,我不太明白你说的线程的参数是什么意思。
其次,不知道你这个具体是什么问题,但我理解是你想取到一个类的非静态的方法的返回值,那么你可以在实现Runnable接口的类里声明一个上述类类型的成员变量,然后就可以在run()方法里调用这个对象的这个方法了。

追问

哦 前面我说的不对。你说的“ 可以在实现Runnable接口的类里声明一个上述类类型的成员变量 ” 这个是我想要的答案。

追答

恩,持有对方的引用,这是一个比较常用的方法

追问

如传递string s。请举例一下形参,实参,和获取到值的方法。

追答

形参是定义方法的时候参数列表里的参数、实参说的调用方法时传递给方法的参数,而run()方法的参数列表为空,你重写run()方法不能改变它的参数列表,所以想找run()方法里拿到值只能在方法体里拿,那就不是所谓的形参、实参了。

追问

是不是线程内可以直接使用线程外定义的变量?不需要通过参数

我就是想从run()内拿到 线程定义前的变量的值

我程序的流程是这样:某个方法的返回值赋值给s;然后定义启动一个线程。其中线程中需要用到变量s。
我的问题是线程中如何拿到s的值?

本回答被提问者和网友采纳
参考技术B Thread.currentThread().getName()追问

这个能在哪里获取run()的里面还是外面

Runnable 怎么获取线程的名字

获取线程名字这件事情本质上和Runnable是没有关系的。一个Runnable可以给多个线程去运行,所以如果在这个概念上你有误解的话,希望重新考虑一下。

另外,在任何时候,你都可以用Thread.currentThread().getName()来获取当前线程的名字
参考技术A Irreappearable回答的就是答非所问,题主问的应该是,在run内部如何获取线程名。因为在外部,不论哪种实现,最后都要以thread对象的形式存在,所以必定会有线程名。
首先,实现runable没有线程名的原因,就是因为你在实现的时候,压根就没有加上线程名,而thread的构造方法public Thread(Runnable target)中,也没有给你写入名字的机会(下面init直接放的是null)。
我建议run内只做线程内基本实现就好,反正去实现接口的,大部分都是要继承一个模板方法,所以,在线程处理的地方加上对独立线程的操作比较好。

以上是关于java runnable线程如何传参?的主要内容,如果未能解决你的问题,请参考以下文章

实战并发编程 - 06线程在执行过程中的状态是如何流转的

Java_线程

Java多线程

Java 基础 - 多线程基础

JUC

java并发之线程执行器(Executor)