java多线程编程之向线程传递数据的三种方法


在Java多线程编程中,向线程传递数据通常可以通过以下几种方法实现:

### 1. 通过构造函数传递

这是最直接的方法,当创建线程对象时,可以通过构造函数将需要的数据传递给线程。


class MyThread extends Thread {
    private int data;

    public MyThread(int data) {
        this.data = data;
    }

    @Override
    public void run() {
        System.out.println("Received data: " + data);
    }

    public static void main(String[] args) {
        MyThread t = new MyThread(100);
        t.start();
    }
}

### 2. 通过共享对象传递

可以创建一个共享对象,多个线程通过操作这个共享对象来传递数据。这种方法需要注意线程安全问题。


class SharedData {
    public int data;
}

class MyThread extends Thread {
    private SharedData sharedData;

    public MyThread(SharedData sharedData) {
        this.sharedData = sharedData;
    }

    @Override
    public void run() {
        // 假设这里仅做打印,实际使用中可能需要同步等线程安全措施
        System.out.println("Received data: " + sharedData.data);
    }

    public static void main(String[] args) {
        SharedData sd = new SharedData();
        sd.data = 200;
        MyThread t = new MyThread(sd);
        t.start();
    }
}

### 3. 通过Callable和Future传递(适用于需要返回结果的场景)

当线程需要返回结果给调用者时,可以使用`Callable`接口配合`Future`来获取线程执行的结果。`Callable`可以抛出异常,而`Runnable`不能。


import java.util.concurrent.*;

class MyCallable implements Callable<Integer> {
    private int input;

    public MyCallable(int input) {
        this.input = input;
    }

    @Override
    public Integer call() throws Exception {
        // 这里可以处理数据,然后返回结果
        return input * 2;
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        MyCallable task = new MyCallable(300);
        Future<Integer> future = executor.submit(task);

        // 获取执行结果
        System.out.println("Result: " + future.get());

        executor.shutdown();
    }
}

以上就是在Java多线程编程中向线程传递数据的三种常见方法。每种方法都有其适用场景,选择时应根据具体需求来决定。