Java线程如何传参

在Java中,线程是一种轻量级的执行单元,可以并发地执行任务。在实际应用中,我们经常需要为线程传递参数,以便线程能够正确执行任务。本文将介绍如何在Java中为线程传递参数,并通过一个实际的问题来展示如何解决这个问题。

问题描述

假设有一个需求:我们需要创建一个线程,这个线程需要对一个数组中的元素进行求和操作。我们希望将这个数组作为参数传递给线程,并在线程执行完毕后得到求和的结果。那么该如何在Java中实现呢?

解决方案

方法一:继承Thread类

我们可以通过继承Thread类并重写其run方法来实现这个需求。我们可以在子类中定义一个成员变量来保存数组,并通过构造函数将数组传递给线程。

public class SumThread extends Thread {
    private int[] array;
    private int sum;

    public SumThread(int[] array) {
        this.array = array;
    }

    @Override
    public void run() {
        for (int num : array) {
            sum += num;
        }
    }

    public int getSum() {
        return sum;
    }
}

方法二:实现Runnable接口

另一种方法是实现Runnable接口,这种方法相对更灵活一些。我们可以在实现类中定义一个成员变量来保存数组,并通过构造函数将数组传递给线程。

public class SumRunnable implements Runnable {
    private int[] array;
    private int sum;

    public SumRunnable(int[] array) {
        this.array = array;
    }

    @Override
    public void run() {
        for (int num : array) {
            sum += num;
        }
    }

    public int getSum() {
        return sum;
    }
}

使用示例

public class Main {
    public static void main(String[] args) {
        int[] nums = {1, 2, 3, 4, 5};

        SumThread thread1 = new SumThread(nums);
        thread1.start();

        SumRunnable runnable = new SumRunnable(nums);
        Thread thread2 = new Thread(runnable);
        thread2.start();

        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Thread 1 sum: " + thread1.getSum());
        System.out.println("Thread 2 sum: " + runnable.getSum());
    }
}

序列图

sequenceDiagram
    participant Main
    participant SumThread
    participant SumRunnable

    Main ->> SumThread: 创建SumThread并传入数组
    Main ->> SumRunnable: 创建SumRunnable并传入数组
    SumThread ->> SumThread: 计算数组元素之和
    SumRunnable ->> SumRunnable: 计算数组元素之和
    Main ->> SumThread: 获取线程计算的结果
    Main ->> SumRunnable: 获取线程计算的结果

状态图

stateDiagram
    [*] --> Created
    Created --> Running: start()
    Running --> Finished: join()
    Running --> Interrupted: interrupted()
    Interrupted --> Running: reset()
    Finished --> [*]: end()

结论

通过继承Thread类或实现Runnable接口,我们可以很方便地为线程传递参数,并且能够得到线程执行任务后的结果。在实际应用中,根据具体需求选择合适的方法来传递参数是非常重要的。希朋友本文对你有所帮助。