zoukankan      html  css  js  c++  java
  • Java 多线程实现方式三:实现 Callable 接口

    完整套路

    java 通过实现Callable 接口来实现多线程相比较于继承Thread 接口和 实现Runnable 接口比较麻烦,但好处是可以有返回值。
    基本套路:
    1. 创建目标对象
    2. 创建执行服务
    3. 提交执行
    4. 获取结果
    5. 关闭服务
    6.
    继续方式一的下载图片,改写一下:

     1 public class CDownload implements Callable<Boolean>{
     2     private String url;
     3     private String name;
     4     public CDownload(String url, String name) {
     5         this.url = url;
     6         this.name = name;
     7     }
     8     @Override
     9     public Boolean call() throws Exception {
    10         WebDownLoad wd = new WebDownLoad();
    11         wd.download(url, name);
    12         System.out.println(name);
    13         return true;
    14     }
    15     public static void main(String[] args) throws InterruptedException, ExecutionException {
    16         CDownload td1 = new CDownload("http://img11.360buyimg.com/n1/s450x450_jfs/t1/95372/26/10103/109107/5e181892Eb698a3bc/2033bb2f00c38f93.jpg", "电脑.jpg");
    17         CDownload td2 = new CDownload("http://img14.360buyimg.com/n1/s450x450_jfs/t1/106229/22/9051/174570/5e0d4a59E099ec5cd/2501bf3e7f96c1fb.jpg", "键盘.jpg");
    18         CDownload td3 = new CDownload("http://img13.360buyimg.com/n1/s450x450_jfs/t1/5916/10/5128/160256/5b9f0e9bEbc9f4db4/14f062751af6ce26.jpg", "鼠标.jpg");
    19         // 创建执行服务
    20         ExecutorService ser =  Executors.newFixedThreadPool(3);
    21         // 提交执行
    22         Future<Boolean> r1 =  ser.submit(td1);
    23         Future<Boolean> r2 =  ser.submit(td2);
    24         Future<Boolean> r3 =  ser.submit(td3);
    25         // 获取结果
    26         Boolean ret1 = r1.get();
    27         Boolean ret2 = r2.get();
    28         Boolean ret3 = r3.get();
    29         System.out.println(ret1 + "--" + ret2 + "--" + ret3);
    30         // 关闭服务
    31         ser.shutdownNow();
    32     }
    33 
    34 }

    简单写法:

     1 package com.xzlf.testThread;
     2 
     3 import java.util.concurrent.Callable;
     4 import java.util.concurrent.ExecutionException;
     5 import java.util.concurrent.FutureTask;
     6 
     7 public class TestFutrueTask {
     8     public static void main(String[] args) throws InterruptedException, ExecutionException {
     9         // 创建任务
    10         MyCall call = new MyCall();
    11         // 交给任务管理器
    12         FutureTask<String> task = new FutureTask<String>(call);
    13         // 创建代理类并启动线程
    14         new Thread(task).start();
    15         System.out.println("获取结果-->" + task.get());
    16         System.out.println("任务是否执行完成-->" + task.isDone());
    17     }
    18 }
    19 
    20 
    21 class MyCall implements Callable<String>{
    22     @Override
    23     public String call() throws Exception {
    24         String[] strs = new String[]{"java", "pyhton", "html", "orcal", "tomcat"};
    25         String result = strs[(int) (Math.random()*5)];
    26         return result;
    27     }
    28 }
    重视基础,才能走的更远。
  • 相关阅读:
    Castle.Aop.Autofac
    signalR 在webfarm下的配置
    SQL语句中 string类型数字的比较
    access 查询空字段
    c#利用jmail发送邮件
    C# 利用Jmail接收邮件
    Asp.net 使用 AXAJ局部刷新无效的解决方法
    把查询的数据放入多维数组中
    获取网站的根目录的物理文件系统路径
    C#.net如何生成静态页带母板的那种
  • 原文地址:https://www.cnblogs.com/xzlf/p/12681529.html
Copyright © 2011-2022 走看看