如何将参数传递给Java线程?| Java Debug 笔记

本文正在参加「Java主题月 – Java Debug笔记活动」,详情查看<活动链接>

提问:如何将参数传递给Java线程?

谁能给我个建议,怎样将参数传递给线程或匿名类吗?

回答一

你可以使用构造函数将参数传递给可运行的对象。

public class MyRunnable implements Runnable {

   public MyRunnable(Object parameter) {
       // store parameter for later user
   }

   public void run() {
   }
}
复制代码

并且像下面这样调用它

Runnable r = new MyRunnable(param_value);
new Thread(r).start();
复制代码

回答二

对于匿名类:

下面的代码描述的是如何将参数传进匿名类

final X parameter = ...; // the final is important
Thread t = new Thread(new Runnable() {
   p = parameter;
   public void run() { 
     ...
   };
t.start();
复制代码

对于正常类:

现在你有一个继承Thread类或实现Runnable接口的类和一个有参构造方法。利用这个对象创建线程时,必须传入参数,然后启动线程,如下所示:

Thread t = new MyThread(args...);
t.start();
复制代码

我认为实现Runnable接口是一种更好的方式,下面是我比较喜欢的实现:

public class MyRunnable implements Runnable {
  private X parameter;
  public MyRunnable(X parameter) {
     this.parameter = parameter;
  }

  public void run() {
  }
}
Thread t = new Thread(new MyRunnable(parameter));
t.start();
复制代码

回答三

通过实现了多线的类的构造函数

class MyThread extends Thread {

    private String to;

    public MyThread(String to) {
        this.to = to;
    }

    @Override
    public void run() {
        System.out.println("hello " + to);
    }
}

public static void main(String[] args) {
    new MyThread("world!").start();
}
复制代码

回答四

我这里有一种方法可以给Runnable传递参数而不必再去声明一个类

String someValue = "Just a demo, really...";

new Thread(new Runnable() {
    private String myParam;

    public Runnable init(String myParam) {
        this.myParam = myParam;
        return this;
    }

    @Override
    public void run() {
        System.out.println("This is called from another thread.");
        System.out.println(this.myParam);
    }
}.init(someValue)).start();
复制代码

当然,你可以将start()方法的执行时间调到你认为合适的时刻。至于init()方法的签名是什么,这也取决于你。实际上,还有另一种方式将参数传递给匿名类,即使用初始代码块。

String someValue = "Another demo, no serious thing...";
int anotherValue = 42;

new Thread(new Runnable() {
    private String myParam;
    private int myOtherParam;
    // instance initializer
    {
        this.myParam = someValue;
        this.myOtherParam = anotherValue;
    }

    @Override
    public void run() {
        System.out.println("This comes from another thread.");
        System.out.println(this.myParam + ", " + this.myOtherParam);
    }
}).start();
复制代码

文章翻译自Stack Overflow:stackoverflow.com/questions/8…

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享