image.png
    image.png

    1.创建一个实现Callable的实现类
    2.实现call方法,将此线程需要执行的操作声明在call()中
    3.创建Callable接口实现类的对象
    4.将此Callable接口实现类的对象作为传递到FutureTask构造器中,创建FutureTask的对象
    5.将FutureTask的对象作为参数传递到Thread类的构造器中,创建Thread对象,并调用start()
    6.(选)获取Callable中call方法的返回值

    1. package com.atguigu.java3;
    2. import java.util.concurrent.Callable;
    3. import java.util.concurrent.ExecutionException;
    4. import java.util.concurrent.FutureTask;
    5. /**
    6. *创建线程的方式三:实现Callable接口。 ---JDK5.0新增
    7. *
    8. *
    9. * 如何理解实现Callable接口的方式创建多线程比实现Runnable接口创建多线程方式强大?
    10. * 1.call()可以有返回值
    11. * 2.call()可以抛出异常,被外面的操作捕获,获取异常的信息
    12. *
    13. * @author Dxkstart
    14. * @create 2021-05-08 16:30
    15. */
    16. public class ThreadNew {
    17. public static void main(String[] args) {
    18. //3.创建Callable接口实现类的对象
    19. NumTread numTread = new NumTread();
    20. //4.将此Callable接口实现类的对象作为传递到FutureTask构造器中,创建FutureTask的对象
    21. FutureTask futureTask = new FutureTask(numTread);
    22. //5.将FutureTask的对象作为参数传递到Thread类的构造器中,创建Thread对象,并调用start()
    23. new Thread(futureTask).start();
    24. try {
    25. //6.(选)获取Callable中call方法的返回值
    26. //get()返回值即为FutureTask构造器参数Callable实现类重写的call()的返回值。
    27. Object sum = futureTask.get();
    28. System.out.println("总和为;" + sum);
    29. } catch (InterruptedException e) {
    30. e.printStackTrace();
    31. } catch (ExecutionException e) {
    32. e.printStackTrace();
    33. }
    34. }
    35. }
    36. //1.创建一个实现Callable的实现类
    37. class NumTread implements Callable{
    38. //2.实现call方法,将此线程需要执行的操作声明在call()中
    39. @Override
    40. public Object call() throws Exception {
    41. int sum = 0;
    42. for(int i = 0;i <= 100;i++){
    43. if(i % 2 == 0){
    44. System.out.println(i);
    45. sum += i;
    46. }
    47. }
    48. return sum;
    49. }
    50. }