在Java中,启动一个线程时,我们可以通过不同的方法来传递参数。下面将介绍三种常用的方法。

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

我们可以通过在线程类的构造函数中定义参数,然后在创建线程对象时传递参数。这种方法适用于参数在整个线程执行期间保持不变的情况。

首先,创建一个继承自Thread类的线程类,并在构造函数中接收参数:

public class MyThread extends Thread {
    private String message;
    
    public MyThread(String message) {
        this.message = message;
    }
    
    public void run() {
        System.out.println(message);
    }
}

然后,创建线程对象并传递参数:

MyThread thread = new MyThread("Hello, World!");
thread.start();

这样,线程在执行时就可以使用传递的参数。

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

我们可以在线程类中定义一个实例变量,然后通过setter方法来设置参数的值。这种方法适用于参数在线程执行期间可能会改变的情况。

首先,创建一个继承自Thread类的线程类,并定义实例变量和setter方法:

public class MyThread extends Thread {
    private String message;
    
    public void setMessage(String message) {
        this.message = message;
    }
    
    public void run() {
        System.out.println(message);
    }
}

然后,创建线程对象,并通过setter方法设置参数的值:

MyThread thread = new MyThread();
thread.setMessage("Hello, World!");
thread.start();

这样,在线程执行期间可以通过调用setter方法来改变参数的值。

方法三:使用匿名内部类传参

我们可以使用匿名内部类来创建线程,并在内部类中访问外部类的变量。这种方法适用于参数在创建线程时就已经确定的情况。

首先,创建一个实现Runnable接口的匿名内部类,并在内部类的run方法中使用外部类的变量:

Runnable runnable = new Runnable() {
    private String message;
    
    public void setMessage(String message) {
        this.message = message;
    }
    
    public void run() {
        System.out.println(message);
    }
};

然后,创建线程对象,并通过内部类的setter方法设置参数的值:

Thread thread = new Thread(runnable);
((MyRunnable)runnable).setMessage("Hello, World!");
thread.start();

这样,线程在执行时就可以使用内部类中的参数。

以上是三种常用的方法来启动一个线程并传递参数。根据具体的需求,选择合适的方法即可。

下面是一个示例状态图,展示了以上三种方法的逻辑关系:

stateDiagram
    [*] --> Created
    Created --> Running
    Running --> [*]
    
    Running --> Paused: Pause the thread
    Paused --> Running: Resume the thread
    
    Running --> Stopped: Stop the thread
    Stopped --> [*]
    
    Created --> [*]

在上述状态图中,我们可以看到线程的状态从创建(Created)开始,然后进入运行(Running)状态。在运行状态中,线程可以暂停(Paused)或停止(Stopped)。暂停的线程可以通过恢复(Resume)操作回到运行状态。停止的线程将直接结束。所有状态的线程都可以回到初始状态([*])。

总结起来,通过构造函数传参、实例变量传参和匿名内部类传参是Java中启动一个线程并传递参数的常用方法。根据具体的需求选择合适的方法,并留意参数的可变性和作用域。