zoukankan      html  css  js  c++  java
  • 通过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();
    
        }
    
    }
    }
  • 相关阅读:
    AJAX
    1.InfluxDB-官方测试数据导入
    storm报错:Exception in thread "main" java.lang.RuntimeException: InvalidTopologyException(msg:Component: [mybolt] subscribes from non-existent stream: [default] of component [kafka_spout])
    J07-Java IO流总结七 《 InputStreamReader和OutputStreamWriter 》
    J06-Java IO流总结六 《 BufferedReader和BufferedWriter 》
    J05-Java IO流总结五 《 BufferedInputStream和BufferedOutputStream 》
    J04-Java IO流总结四 《 FileReader和FileWriter 》
    J03-Java IO流总结三 《 FileInputStream和FileOutputStream 》
    J02-Java IO流总结二 《概述》
    J01-Java IO流总结一 《异常捕获》
  • 原文地址:https://www.cnblogs.com/lukelook/p/11128266.html
Copyright © 2011-2022 走看看