Java 子线程主线程如何交互
在Java中,子线程和主线程之间的交互是一种常见的需求。通常,主线程需要等待子线程执行完毕并获取其结果,或者主线程需要向子线程发送消息,控制其执行流程。下面将介绍一种解决方案来实现子线程和主线程之间的交互。
问题描述
假设我们有一个需求:主线程需要启动一个子线程来计算一个复杂的任务,然后等待子线程计算完成并获取计算结果。
解决方案
我们可以使用Callable
和Future
来实现子线程与主线程之间的交互。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
方法等待子线程执行完毕并获取计算结果。
总结
通过使用Callable
和Future
,我们可以很方便地实现子线程与主线程之间的交互。主线程可以等待子线程执行完毕并获取结果,也可以向子线程发送消息控制其执行流程。这种方式能够增强程序的灵活性和扩展性,同时提高代码的可读性和可维护性。在实际开发中,可以根据具体需求灵活运用这种方式来实现线程间的交互。