在Java中,向多线程中传递参数是常见的需求。这里将介绍三种常用的方法来实现这一点:
### 1. 通过构造函数传递参数
这是最直接的方法之一。在创建线程类的实例时,通过构造函数将参数传递给线程对象。然后,在`run`方法中就可以使用这些参数了。
class MyThread extends Thread {
private int param;
public MyThread(int param) {
this.param = param;
}
@Override
public void run() {
System.out.println("Thread running with param: " + param);
}
}
public class Main {
public static void main(String[] args) {
MyThread t1 = new MyThread(10);
t1.start();
}
}
### 2. 通过实现Runnable接口传递参数
如果你的线程类继承自其他类,那么你不能直接从`Thread`类继承。这时,可以通过实现`Runnable`接口来创建线程,并通过构造函数或setter方法将参数传递给实现类。
class MyRunnable implements Runnable {
private int param;
public MyRunnable(int param) {
this.param = param;
}
@Override
public void run() {
System.out.println("Runnable running with param: " + param);
}
}
public class Main {
public static void main(String[] args) {
Thread t1 = new Thread(new MyRunnable(20));
t1.start();
}
}
### 3. 使用Callable和Future传递参数及返回值
当需要从线程中获取返回值时,可以使用`Callable`接口和`Future`对象。`Callable`类似于`Runnable`,但它可以返回一个结果,并且可以抛出异常。`Future`用于获取`Callable`任务的结果。
import java.util.concurrent.*;
class MyCallable implements Callable<Integer> {
private int param;
public MyCallable(int param) {
this.param = param;
}
@Override
public Integer call() throws Exception {
// 模拟计算过程
Thread.sleep(1000);
return param * 2;
}
}
public class Main {
public static void main(String[] args) throws InterruptedException, ExecutionException {
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<Integer> future = executor.submit(new MyCallable(30));
// 等待任务完成并获取结果
Integer result = future.get();
System.out.println("Result from Callable: " + result);
executor.shutdown();
}
}
这三种方法各有适用场景,可以根据具体需求选择使用。