java线程池——接收线程运行后返回的结果

java线程池——接收线程运行后返回的结果

java1.5新加入了线程同步的包。java.util.concurrent
其中有接口ExecutorService。


Executor提供了管理线程结束的方法,通过Future接口,能够跟踪一个或者多个异步线程运行的结果。
ExecutorService能够被shutdown,shutdown后,拒绝提交新的任务。ExecutorSerivce提供了两种shutdown的方式。shutdown()方法让先前已经提交的任务在终止操作前继续执行,而shutdownNow()方法阻止正在等待的线程启动,并且尝试终止当前正在运行的进程。终止线程后,Executor没有活跃的线程需要执行,也没有新的任务线程被提交。一个没有使用的ExecuteService应该被关闭,并且释放占用的资源。
Submit方法继承自Executor.execute(java.long.Runnable)方法,并且返回Future用来取消线程执行或者等待线程完成。invokeAny和invokeAll方法在执行大量线程时很常用。
Executors类提供了ExecutorService接口的工厂实现。

好,下面上货。
package com.xueyoucto.xueyou;

import java.util.concurrent.Callable;

public class ThreadReturnValue implements Callable {
    @Override
    public Object call() throws Exception {
        int temp = 0;
        StringBuffer sb = new StringBuffer("");
        synchronized (App.GLOBALARRAY) {
            for (int i = 0; i < App.GLOBALARRAY.length; i++) {
                System.out.println(Thread.currentThread().getName() + "\n" + App.GLOBALARRAY[i]);
                App.GLOBALARRAY[i] += 1;
                temp += App.GLOBALARRAY[i];
                sb.append("+").append(App.GLOBALARRAY[i]);
            }
        }
        return sb.toString() + "=" + temp;
    }
}

package com.xueyoucto.xueyou;


import java.util.concurrent.*;

/**
 * Hello world!
 */
public class App {
    public static int[] GLOBALARRAY = new int[50];

    public static ThreadLocal<String[]> TLGLOBALARRAY = new ThreadLocal<String[]>() {
        @Override
        protected String[] initialValue() {
            String[] temp = new String[50];
            for (int i = 0; i < temp.length; i++) {
                temp[i] = String.valueOf(i + 100);
            }
            return temp;
        }
    };

    static {
        for (int i = 0; i < GLOBALARRAY.length; i++) {
            GLOBALARRAY[i] = i;
        }
    }

    public static void main(String[] args) {
        ExecutorService pool = Executors.newFixedThreadPool(3);
        Future<String> future = pool.submit(new ThreadReturnValue());
        Future<String> future2 = pool.submit(new ThreadReturnValue());
        Future<String> future3 = pool.submit(new ThreadReturnValue());
        pool.shutdown(); // 不允许再想线程池中增加线程
        //判断是否所有线程已经执行完毕
        try {
            boolean isFinish = pool.awaitTermination(1, TimeUnit.HOURS);
            System.out.println(isFinish + "==========================");
            //如果没有执行完
            if (!isFinish) {
                //线程池执行结束 不在等待线程执行完毕,直接执行下面的代码
                pool.shutdownNow();
            }
            String r = future.get();
            String r2 = future2.get();
            String r3 = future3.get();

            System.out.println(r);
            System.out.println(r2);
            System.out.println(r3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        //只给线程池中的线程1小时,然后就继续执行
        System.out.println("it is ok !!!");
    }
}

运行结果:


需要注意的是ExecutorService提供的是线程池的功能,并没有提供线程同步、互斥等功能,所以还是需要在互斥访问的变量上进行处理的。下面是没有处理的代码和结果,可以对比一下。

package com.xueyoucto.xueyou;

import java.util.concurrent.Callable;

public class ThreadReturnValue implements Callable {
    @Override
    public Object call() throws Exception {
        int temp = 0;
        StringBuffer sb = new StringBuffer("");
        for (int i = 0; i < App.GLOBALARRAY.length; i++) {
            System.out.println(Thread.currentThread().getName() + "\n" + App.GLOBALARRAY[i]);
            App.GLOBALARRAY[i] += 1;
            temp += App.GLOBALARRAY[i];
            sb.append("+").append(App.GLOBALARRAY[i]);
        }
        return sb.toString() + "=" + temp;
    }
}

运行结果(注意最后的结果):



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
全部代码出自电子工业出版社夏先波的《Java JDK实例宝典》一书,本书以J2SE 5.0为开发环境,选取Java应用的典型实例,循序渐进地介绍了Java语言的各种开发方法和技巧,实例代码注释详细规范,思路清晰。<br>第1章 Java基础 <br>1.1 转换基本数据类型 <br>1.2 Java的运算符 <br>1.3 控制程序的流程 <br>1.4 计算阶乘 <br>1.5 实现命令行程序 <br>第2章 Java面向对象程序设计 <br>2. 1 复数类 <br>2. 2 equals.chashCode和clone方法 <br>2. 3 Java的参数传递 <br>2. 4 自定义形状类 <br>2. 5 类的加载顺序 <br>2. 6 方法和变量在继承时的覆盖与隐藏 <br>2. 7 排序类 <br>2. 8 Singleton单例模式 <br>2. 9 Factory工厂模式 <br>2. 10 Adapter适配器模式 <br>第3章 数字 <br>3. 1 数字与数字封装类 <br>3. 2 格式化数字 <br>3. 3 数字的舍入 <br>3. 4 转换数字的进制 <br>3. 5 生成随机数 <br>3. 6 处理大数字 <br>第4章 数组与集合 <br>4. 1 使用Arrays <br>4. 2 求质数. <br>4. 3 动态调整数组长度 <br>4. 4 矩阵 <br>4. 5 ArrayList. Vector和LinkedList <br>4. 6 生成不重复的随机数序列 <br>4. 7 自定义队列 <br>4. 8 对List排序 <br>4. 9 HashSet. LinkedHashSet和TreeSet <br>4. 10 列表. 集合与数组的互相转换 <br>4. 11 HashMap. Hashtable. LinkedHashMap和TreeMap <br>4. 12 对Map排序 <br>4. 13 Properties属性文件 <br>第5章 字符串 <br>5. 1 使用String <br>5. 2 基本数据类型与字符串的转化 <br>5. 3 判断Java标识符 <br>5. 4 使用StringBuffer <br>5. 5 IP地址转化成整数 <br>5. 6 18位身份证格式验证 <br>5. 7 表达式解析器 <br>5. 8 字符串编码的转换 <br>5. 9 字符串对齐器 <br>5. 10 密码加密与验证 <br>5. 11 制作命令行程序 <br>5. 12 使用StringTokenizer <br>5. 13 使用正则表达式操作字符串 <br>5. 14 使用正则表达式验证电话号码的格式 <br>第6章 Java异常处理 <br>6. 1 throw. throws. try和catch <br>6. 2 自定义异常类 <br>6. 3 使用finally <br>6. 4 使用异常的技巧与原则 <br>第7章 IO——输入输出流 <br>7. 1 获取文件的属性信息 <br>7. 2 列出指定目录下的文件 <br>7. 3 创建文件和目录 <br>7. 4 删除文件和目录 <br>7. 5 移动文件和目录 <br>7. 6 复制文件和目录 <br>7. 7 一个简单的文件搜索器 <br>7. 8 读文件 <br>7. 9 写文件 <br>7. 10 添加内容到文件尾 <br>7. 11 文件的分割与合并 <br>7. 12 从键盘接收数据并输出到文件 <br>7. 13 使用StreamTokenizer统计文件的字符数 <br>7. 14 序列化和反序列化对象 <br>7. 15 控制对象的序列化和反序列 <br>7. 16 读jar包的资源文件 <br>7. 17 用Zip格式压缩和解压缩文件 <br>7. 18 操作Excel文件 <br>7. 19 操作PDF文件 <br>7. 20 自定义日志文件类 <br>第8章 线程 <br>8. 1 定义和启动线程 <br>8. 2 停止线程 <br>8. 3 线程的互斥 <br>8. 4 线程的协作 <br>8. 5 线程join <br>8. 6 生产者. 消费者问题 <br>8. 7 线程优先级 <br>8. 8 列出虚拟机中所有的线程 <br>8. 9 守护线程Daemon <br>8. 10 线程池 <br>8. 11 一个死锁的例子 <br>8. 12 定时器Timer <br>第9章 Java GUI <br>9. 1 日历 <br>9. 2 开窗户游戏 <br>9. 3 标准型计算器 <br>9. 4 更改组件的外观 <br>9. 5 自定义对话框 <br>9. 6 制作欢迎画面 <br>9. 7 一个简单的编辑器 <br>9. 8 Swing的Drag和Drop <br>第10章 Java图形 <br>10. 1 一个圆形的按钮 <br>10. 2 捕捉屏幕 <br>10. 3 缩放图片 <br>10. 4 2D图形 <br>10. 5 3D图形.. <br>10. 6 一个时钟程序 <br>第11章 Java多媒体 <br>11. 1 滚动的消息 <br>11. 2 三维弹球 <br>11. 3 贪吃蛇游戏 <br>11. 4 Java声音处理 <br>11. 5 媒体播放器 <br>第12章 反射 <br>12. 1 instanceof操作符 <br>12. 2 获取类的信息 <br>12. 3 动态调用类的方法 <br>第13章 网络编程 <br>13. 1 获取URL的信息 <br>13. 2 Web浏览器 <br>13. 3 获取IP地址和域名 <br>13. 4 HTTP客户端 <br>13. 5 基本的Socket编程 <br>13. 6 HTTP服务器 <br>13. 7 一个支持多线程的服务器框架 <br>13. 8 代理服务器 <br>13. 9 Telnet客户端 <br>13. 10 UDP编程 <br>13. 11 聊天室服务器端 <br>13. 12 聊天室客户端 <br>13. 13 FTP客户端 <br>第14章 数据库 <br>14. 1 连接各种数据库 <br>14. 2 获得数据库和表的元数据 <br>14. 3 查询和更新数据库 <br>14. 4 批处理 <br>14. 5 提交与回滚事务 <br>14. 6 使用PreparedStatement <br>14. 7 读写二进制数据 <br>14. 8 读写Blob数据 <br>14. 9 使用ResultSet更新数据库 <br>14. 10 使用RowSet <br>14. 11 调用存储过程 <br>14. 12 一个数据库连接池 <br>第15章 Applet <br>15. 1 Applet时钟 <br>15. 2 处理鼠标和键盘事件 <br>15. 3 英文打字游戏 <br>15. 4 Applet间通信 <br>15. 5 汉诺塔游戏 <br>第16章 J2SE 5. 0新特性 <br>16. 1 自动装箱和拆箱 <br>16. 2 新的for循环 <br>16. 3 枚举类型 <br>16. 4 静态导入 <br>16. 5 可变长参数Varargs <br>16. 6 格式化输出 <br>16. 7 使用ProcessBuilder执行本地命令 <br>16. 8 泛型编程 <br>16. 9 注释功能Annotation <br>16. 10 监控与管理虚拟机 <br>16. 11 线程——Callable和Future <br>16. 12 线程——任务执行架构 <br>16. 13 线程——锁Lock <br>16. 14 线程——条件Condition <br>16. 15 线程——Semaphore <br>16. 16 线程——CountDownLatch <br>16. 17 线程——Cycli Barrier <br>16. 18 线程——Exchanger <br>16. 19 线程——BlockingQueue <br>第17章 Java与XML <br>17. 1 用DOM处理XML文档 <br>17. 2 用SAX处理XML文档 <br>17. 3 用XSLT转换XML <br>17. 4 对象与XML的转换 <br>第18章 Java Mail <br>18. 1 使用SMTP协议发送简单邮件 <br>18. 2 发送带附件的邮件 <br>18. 3 给多人发送邮件 <br>18. 4 使用POP3接收邮件 <br>第19章 JSP与Servlet <br>19. 1 获取客户端的真实IP地址 <br>19. 2 设置矛口读取Cookie <br>19. 3 JSP无刷新聊天室 <br>19. 4 上传文件 <br>19. 5 用Servlet生成图形验证码 <br>19. 6 用Servlet实现分页查看数据库 <br>
Java网络编程(第三版)中文版(不看后悔) JAVA Network Programming,Third Edition 原出版社: O'Reilly 作者: (美)Elliotte Rusty Harold [作译者介绍] 译者: 朱涛江[同译者作品] 林剑 丛书名: O'Reilly Java系列 出版社:中国电力出版社 编辑推荐 “直到找到这本书之后,我才开始理解Java网络编程。” ——Bruce Eckel,《Thinking in Java》的作者 内容简介回到顶部↑《Java网络编程》第三版会为你介绍Java网络API的最新特性。本书讨论了JDK 1.4和1.5(现在已命名为J2SE 5)中所做的所有修改和增补。本书内容全面,涵盖了从网络基础知识到远程方法调用(RMI)等各方面的内容,书中章节涉及到TCP和UDP socket、服务器socket、URL和URI、组播以及特殊用途的API(如JavaMail)等等。本书展示了如何使用JSSE编写安全的网络应用程序,解释了如何使用NIO API编写超高性能的服务器。它还涵盖了Java对网络代理、Web cookie和URL缓存的支持。 《Java网络编程》不仅仅是对API的解释:它还展示了如何使用API。本书有很多示例,包含了几千行可以实际工作的代码(所有代码都可以在线获得),实现了功能完整的网络客户端和服务器。无论是希望编写特殊用途的web服务器、安全的在线订单接收程序、简单的组播代理还是电子邮件客户端,都会找到可供学习和借用的代码。 本书适合熟悉Java语言的读者的编程人员和计算机专业的学生阅读。 前言 1 第一章 Java网络编程的原因 13 网络程序的功能 14 安全性 27 等等!还有更多! 29 第二章 基本网络概念 30 网络 30 网络的分层 32 IP、TCP和UDP 37 Internet 40 客户/服务器模型 46 Internet标准 47 第三章 基本Web概念 56 URI 56 HTML、SGML和XML 63 HTTP 65 MIME媒体类型 69 服务器端程序 74 第四章 流 78 输出流 79 .输入流 83 过滤器流 87 阅读器和书写器 101 第五章 线程 116 运行线程 118 返回线程中的信息 122 同步 133 死锁 139 线程调度 140 线程池 153 第六章 查找Internet地址 159 InetAddress类 161 Inet4Address和Inet6Address 177 NetworkInterface类 178 一些有用的程序 181 第七章 URL和URI 192 URL类 192 URLEncoder和URLDecoder类 216 URI类 222 代理 230 通过GET方法与服务器端程序通信 233 访问受口令保护的网站 237 第八章 Swing中的HTML 245 组件上的HTML 245 JEditorPane 247 解析HTML 256 cookie 274 第九章 客户端Socket 283 socket基础 283 用Telnet研究协议 284 Socket类 286 Socket异常 312 Socket地址 313 示例 314 第十章 服务器socket 332 ServerSocket类 332 一些有用的服务器 349 第十一章 安全Socket 370 保护通信 371 创建安全客户端Socket 374 SSLSocket类的方法 378 创建安全的服务器Socket 383 SSLServerSocket类的方法 388 第十二章 非阻塞I/O 391 一个示例客户端 392 一个示例服务器 396 缓冲区 402 通道 421 就绪选择 427 第十三章 UDP数据报和Socket 431 UDP协议 431 DatagramPacket类 433 DatagramSocket类 442 一些有用的应用程序 456 DatagramChannel 469 第十四章 组播socket 478 何为组播socket? 479 使用组播socket 487 两个简单示例 495 第十五章 URLConnection 501 打开URLConnection 502 读取服务器的数据 503 读取首部 505 配置连接 514 配置客户端的请求HTTP首部 523 向服务器写入数据 525 内容处理器 530 Object方法 532 URLConnection的安全考虑 533 猜测MIME内容类型 533 HttpURLConnection 537 缓存 552 JarURLConnection 557 第十六章 协议处理器 560 何为协议处理器? 560 URLStreamHandler类 564 编写协议处理器 571 更多协议处理器示例和技术 576 URLStreamHandlerFactory接口 583 第十七章 内容处理器 588 何为内容处理器? 590 ContentHandler类 592 ContentHandlerFactory接口 603 FITS图片格式的内容处理器 606 第十八章 远程方法调用 617 何为远程方法调用? 617 实现 623 在运行时加载类 631 java.rmi包 634 java.rmi.registry包 640 java.rmi.server包 642 第十九章 JavaMail API 648 何为JavaMail API? 649 发送电子邮件 651 接收邮件 661 口令认证 666 地址 670 URLName类 674 Message类 677 Part接口 689 多部分消息和附件 699 MIME消息 703 文件夹 705

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值