在Java中,主线程可以通过不同的方式将参数传递给子线程。下面我们将介绍几种常用的方法。

方法一:通过构造方法传参

通过在子线程的构造方法中接受参数,可以将主线程的参数传递给子线程。以下是一个简单的示例代码:

class MyThread extends Thread {
    private String message;

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

    @Override
    public void run() {
        System.out.println("Message received in child thread: " + message);
    }
}

public class Main {
    public static void main(String[] args) {
        String message = "Hello, world!";
        MyThread thread = new MyThread(message);
        thread.start();
    }
}

在上面的示例中,主线程通过创建MyThread对象时传入一个字符串参数,然后启动子线程。子线程在运行时会打印出收到的消息。

方法二:通过实例方法传参

除了构造方法,我们还可以通过实例方法来传递参数。以下是一个示例代码:

class MyRunnable implements Runnable {
    private String message;

    public void setMessage(String message) {
        this.message = message;
    }

    @Override
    public void run() {
        System.out.println("Message received in child thread: " + message);
    }
}

public class Main {
    public static void main(String[] args) {
        String message = "Hello, world!";
        MyRunnable myRunnable = new MyRunnable();
        myRunnable.setMessage(message);
        Thread thread = new Thread(myRunnable);
        thread.start();
    }
}

在这个示例中,主线程创建了一个MyRunnable对象,然后通过调用setMessage方法将参数传递给子线程。

方法三:使用CallableFuture

另一种常用的方式是使用Callable接口和Future对象。以下是一个示例代码:

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

class MyCallable implements Callable<String> {
    @Override
    public String call() {
        return "Hello, world!";
    }
}

public class Main {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        Callable<String> callable = new MyCallable();
        FutureTask<String> futureTask = new FutureTask<>(callable);
        Thread thread = new Thread(futureTask);
        thread.start();
        System.out.println("Message received in main thread: " + futureTask.get());
    }
}

在这个示例中,子线程通过实现Callable接口来返回一个参数,并且主线程通过FutureTask对象获取子线程返回的参数。

状态图

下面是一个简单的状态图,展示了主线程和子线程之间的交互过程:

stateDiagram
    MainThread --> ChildThread: 传递参数
    ChildThread --> MainThread: 返回结果

通过上述方法,可以很容易地在Java中将主线程的参数传递给子线程。无论是通过构造方法、实例方法还是Callable接口,都能实现参数的传递和子线程的执行。在实际应用中,可以根据具体情况选择合适的方法来传递参数,以达到更好的效果。