Java 子线程主线程如何交互

在Java中,子线程和主线程之间的交互是一种常见的需求。通常,主线程需要等待子线程执行完毕并获取其结果,或者主线程需要向子线程发送消息,控制其执行流程。下面将介绍一种解决方案来实现子线程和主线程之间的交互。

问题描述

假设我们有一个需求:主线程需要启动一个子线程来计算一个复杂的任务,然后等待子线程计算完成并获取计算结果。

解决方案

我们可以使用CallableFuture来实现子线程与主线程之间的交互。Callable接口表示具有返回值的任务,Future接口用于获取任务的执行结果。

首先,定义一个实现Callable接口的子线程类,用于执行复杂的计算任务:

import java.util.concurrent.Callable;

public class MyCallable implements Callable<Integer> {
    
    @Override
    public Integer call() throws Exception {
        // 执行复杂的计算任务
        int result = 0;
        for (int i = 0; i < 10; i++) {
            result += i;
        }
        return result;
    }
}

然后,在主线程中创建一个ExecutorService来执行子线程,并获取子线程的执行结果:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class Main {

    public static void main(String[] args) {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        MyCallable myCallable = new MyCallable();
        
        Future<Integer> future = executor.submit(myCallable);
        
        try {
            int result = future.get(); // 等待子线程执行完毕并获取结果
            System.out.println("子线程计算结果:" + result);
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        executor.shutdown();
    }
}

在这段代码中,我们首先创建一个ExecutorService对象,并使用newSingleThreadExecutor方法创建一个单线程的线程池。然后创建MyCallable对象,并通过submit方法将其提交给线程池执行,并返回一个Future对象。最后通过get方法等待子线程执行完毕并获取计算结果。

总结

通过使用CallableFuture,我们可以很方便地实现子线程与主线程之间的交互。主线程可以等待子线程执行完毕并获取结果,也可以向子线程发送消息控制其执行流程。这种方式能够增强程序的灵活性和扩展性,同时提高代码的可读性和可维护性。在实际开发中,可以根据具体需求灵活运用这种方式来实现线程间的交互。