Homework_03.java 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package homework0808;
  2. import java.util.concurrent.Callable;
  3. import java.util.concurrent.FutureTask;
  4. /**
  5. * @author WanJl
  6. * @version 1.0
  7. * @title Homework_03
  8. * @description
  9. * @create 2026/8/10
  10. */
  11. public class Homework_03 {
  12. // ========== ① 实现 Callable 接口,泛型指定返回类型 ==========
  13. static class SumCallable implements Callable<Integer> {
  14. private int n; // 求 1~n 的和
  15. public SumCallable(int n) {
  16. this.n = n;
  17. }
  18. @Override
  19. public Integer call() throws Exception {
  20. // TODO 1: int sum = 0; 计算 1~n 的累加和
  21. int sum = 0;
  22. // TODO 2: 打印 Thread.currentThread().getName() + "求和结果:" + sum
  23. for (int i = 1; i <=n; i++) {
  24. sum+=i;
  25. }
  26. System.out.println(Thread.currentThread().getName() + "求和结果:" + sum);
  27. // TODO 3: return sum; // 返回计算结果(get() 会拿到这个值)
  28. return sum;
  29. }
  30. }
  31. public static void main(String[] args) throws Exception {
  32. // TODO 4: 创建 3 个 SumCallable 对象(求 1~100 / 1~1000 / 1~10000 的和)
  33. SumCallable sc1=new SumCallable(100);
  34. SumCallable sc2=new SumCallable(1000);
  35. SumCallable sc3=new SumCallable(10000);
  36. // TODO 5: 用 FutureTask<Integer> 包装每个 Callable 对象
  37. FutureTask<Integer> ft1=new FutureTask<>(sc1);
  38. FutureTask<Integer> ft2=new FutureTask<>(sc2);
  39. FutureTask<Integer> ft3=new FutureTask<>(sc3);
  40. // TODO 6: new Thread(futureTask, "线程名") 创建 3 个线程并 start()
  41. Thread t1=new Thread(ft1,"线程1");
  42. Thread t2=new Thread(ft2,"线程2");
  43. Thread t3=new Thread(ft3,"线程3");
  44. t1.start();
  45. t2.start();
  46. t3.start();
  47. // TODO 7: 调用 ft.get() 获取每个线程的返回值,打印并在 main 中汇总总结果
  48. System.out.println(ft1.get());
  49. System.out.println(ft2.get());
  50. System.out.println(ft3.get());
  51. // TODO 8: (思考)对比三种实现方式:run() 无返回值 vs call() 有返回值,各自适合什么场景
  52. }
  53. }