• 通过Callable接口实现多线程


    一.通过Callable接口实现多线程

    c.实现Callable重写call方法
    实现Callable和实现Runnable类似,但是功能更强大,具体表现在
    a.可以在任务结束后提供一个返回值,Runnable不行
    b.call方法可以抛出异常,Runnable的run方法不行
    c.可以通过运行Callable得到的Fulture对象监听目标线程调用call方法的结果,得到返回值,(fulture.get(),调用后会阻塞,直到获取到返回值)

    1.Callable接口介绍:

    (1)java.util.concurrent.Callable是一个泛型接口,只有一个call()方法

    (2)call()方法抛出异常Exception异常,且返回一个指定的泛型类对象

    2.Callable接口实现多线程的应用场景

    (1)当父线程想要获取子线程的运行结果时

    3.使用Callable接口实现多线程的步骤

    (1)第一步:创建Callable子类的实例化对象

    (2)第二步:创建FutureTask对象,并将Callable对象传入FutureTask的构造方法中

    (注意:FutureTask实现了Runnable接口和Future接口)

     (3)第三步:实例化Thread对象,并在构造方法中传入FurureTask对象

     (4)第四步:启动线程

    例1(利用Callable接口实现线程):

    利用Callable接口创建子线程类:

    package com.my.frame;
    
    import java.util.concurrent.Callable;
    
    public class ThreadCall implements Callable<String> {
    
        @Override
        public String call() throws Exception {
            // TODO Auto-generated method stub
            System.out.println("=====");
            return "9999";
        }
    
    
    }
    package com.my.frame;
    
    import java.util.concurrent.FutureTask;
    
    public class TestThread {
        public static void main(String[] args) {
            
            FutureTask<String> ft = new FutureTask<>(new ThreadCall());
            new Thread(ft).start();
        }
    
    }

    例2(匿名类部类实现Callable接口创建子线程):

    匿名类部类实现Callable接口创建子线程类并实现:

    package call;
    
     
    
    import java.util.concurrent.Callable;
    
    import java.util.concurrent.ExecutionException;
    
    import java.util.concurrent.FutureTask;
    
    //匿名类部类实现Callable接口创建子线程
    
    public class AnonyCallable {
    
     
    
        public static void main(String[] args) {
    
        Callable<String> cl = new Callable<String>() {
    
         
    
        @Override
    
        public String call() throws Exception {
    
                System.out.println(Thread.currentThread().getName() + "正在行军~~~");
    
                System.out.println(Thread.currentThread().getName() + "遭遇敌军~~~");
    
                System.out.println(Thread.currentThread().getName() + "奋勇杀敌!!!!");
    
                return "战斗胜利,俘虏敌军50000人";
    
                }
    
     
    
    };
    
            FutureTask<String> ft = new FutureTask(cl);
    
            new Thread(ft, "李存孝部队").start();
    
    try {
    
            Thread.currentThread().setName("李存勖部队");
    
            Thread.sleep(3000);
    
            System.out.println(Thread.currentThread().getName() + "休整3000ms");
    
    } catch (InterruptedException e) {
    
        e.printStackTrace();
    
    }
    
        System.out.println(Thread.currentThread().getName() + "整顿完毕,等待友军消息...");
    
    try {
    
                String str = ft.get();
    
                System.out.println("李存勖部队得知友军消息为:" + str);
    
    } catch (InterruptedException | ExecutionException e) {
    
        e.printStackTrace();
    
        }
    
    }
    }
  • 相关阅读:
    软件工程-个人最终总结
    结对编程—电梯调度
    第三周(第三作业)感想
    周三第二个作业
    VS2013安装和单元测试
    对京东的评价
    简单的四则运算
    迷茫的软件工程
    vlan 和 子网
    ECLIPSE的jar包和文件的导入导出
  • 原文地址:https://www.cnblogs.com/lukelook/p/11128266.html
Copyright © 2020-2023  润新知