java向多线程中传递参数的三种方法详细介绍


在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();
    }
}

这三种方法各有适用场景,可以根据具体需求选择使用。