import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; public class ThreeThread { public static void main(String[] args) { //工作线程 Worker worker = new Worker(); //使用 FutrueTask 包装 Callable 对象 FutureTask<Integer> ft = new FutureTask<>(worker); for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName() + "循环变量i的值:" + i); if (i == 5) { new Thread(ft, "有返回值的线程").start(); } try { //获取线程返回值 System.out.println("子线程的返回值:" + ft.get()); } catch (Exception e) { e.printStackTrace(); } } } //创建 Callable 接口的实现类 public static class Worker implements Callable<Integer> { // Class 'Worker' must either be declared abstract or implement abstract method 'call()' in 'Callable' @Override public Integer call() throws Exception { int t = 0; for (; t < 10; t++) { System.out.println(Thread.currentThread().getName() + "循环变量t的值:" + t); } return t; } } }代码只打印了 main循环变量i的值:0
时间: 2024-03-18 14:43:28 浏览: 37
这段代码只输出了主线程循环变量 i 的值 0,原因是在主线程中,当 i 的值等于 5 时,新启动了一个子线程来执行 FutureTask,但是在主线程中立即通过 ft.get() 方法获取了子线程的返回值,此时主线程会一直阻塞等待子线程的返回值,并且子线程也还没有机会执行。因此,程序只输出了主线程循环变量 i 的值 0,而没有输出子线程的任何信息。要解决这个问题,可以将获取子线程返回值的代码放到 for 循环外面,等待子线程执行完毕再获取其返回值。
相关问题
how should i finish this package step2; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; // ---------------------Begin------------------------ //tips: 输出语句为:Thread.currentThread(
).getName() + ": " + i // 实现Callable接口来创建线程 class MyCallable implements Callable<Integer> { @Override public Integer call() throws Exception { int sum = 0; for (int i = 1; i <= 100; i++) { System.out.println(Thread.currentThread().getName() + ": " + i); sum += i; } return sum; } } public class Main { public static void main(String[] args) throws InterruptedException, ExecutionException { // 创建Callable对象 MyCallable myCallable = new MyCallable(); // 将Callable对象封装成一个FutureTask对象 FutureTask<Integer> futureTask = new FutureTask<>(myCallable); // 创建线程并启动 Thread thread = new Thread(futureTask); thread.start(); // 获取线程执行结果 int result = futureTask.get(); System.out.println("线程执行结果为:" + result); } } // ----------------------End-------------------------
import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; public class ThreeThread { public static void main(String[] args) { //工作线程 Worker worker = new Worker(); //使用 FutrueTask 包装 Callable 对象 FutureTask<Integer> ft = new FutureTask<>(worker); for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName() + "循环变量i的值:" + i); if (i == 5) { new Thread(ft, "有返回值的线程").start(); new Thread(ft, "1").start(); } } } //创建 Callable 接口的实现类 public static class Worker implements Callable<Integer> { // Class 'Worker' must either be declared abstract or implement abstract method 'call()' in 'Callable' @Override public Integer call() throws Exception { int t = 0; for (; t < 10; t++) { System.out.println(Thread.currentThread().getName() + "循环变量t的值:" + t); } return t; } } }代码只输出一个子线程信息
这段代码中,使用了一个FutureTask对象ft来包装Callable接口实现类Worker的实例对象worker,并将ft传递给一个新线程,并启动该线程。当循环变量i的值等于5时,会启动两个新线程,都使用了同一个FutureTask对象ft,因此会输出两个子线程信息,但是它们都在执行同一个Callable对象的call()方法,因此输出的内容是相同的。在主线程中,没有调用ft.get()方法获取子线程的返回值,因此不会输出子线程的返回值。
阅读全文