实现Runnable接口 并返回结果
时间: 2024-10-17 08:14:07 浏览: 24
在Java中,如果你想通过实现Runnable接口来创建一个多线程任务并且需要从这个任务中返回结果,你需要稍微修改一下常规的实现方式。因为Runnable接口并不直接支持返回值,你可以选择以下两种方案:
**方案一:通过共享数据结构**
如果你希望在主线程中获取到子线程的结果,可以使用同步容器(如`BlockingQueue`)或者其他共享数据结构。例如,使用`LinkedBlockingQueue`:
```java
import java.util.concurrent.*;
public class ResultProducer implements Runnable {
private final BlockingQueue<Integer> resultQueue;
public ResultProducer(BlockingQueue<Integer> queue) {
this.resultQueue = queue;
}
@Override
public void run() {
// 计算一些结果
int result = computeResult();
synchronized (resultQueue) {
resultQueue.offer(result);
}
}
private int computeResult() {
// ... 你的计算逻辑
return someComputedValue;
}
public Integer getResult() throws InterruptedException {
return resultQueue.take(); // 主线程等待结果
}
public static void main(String[] args) {
BlockingQueue<Integer> queue = new LinkedBlockingQueue<>();
Thread producer = new Thread(new ResultProducer(queue));
producer.start();
// 等待结果
try {
Integer result = producer.getResult();
System.out.println("Received result: " + result);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
```
**方案二:使用Future和Callable接口**
如果需要返回值,可以使用`java.util.concurrent.Callable`接口,它结合了Runnable和Callable特性。创建一个实现了`Callable`的类,然后将其实例提交给`ExecutorService`:
```java
import java.util.concurrent.*;
public class CallableExample implements Callable<Integer> {
@Override
public Integer call() {
// 计算并返回结果
return computeResult();
}
private int computeResult() {
// ... 你的计算逻辑
return someComputedValue;
}
public static void main(String[] args) {
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<Integer> future = executor.submit(new CallableExample());
try {
Integer result = future.get(); // 主线程等待结果
System.out.println("Received result: " + result);
} catch (Exception e) {
e.printStackTrace();
}
executor.shutdown();
}
}
```
在这个例子中,`future.get()`会阻塞直到任务完成并获取结果。
阅读全文