本文正在参加「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