博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于多线程的参数问题
阅读量:7227 次
发布时间:2019-06-29

本文共 3616 字,大约阅读时间需要 12 分钟。

体会多线程的参数问题,可以用下面的代码测试,分别放开 注释1 和 注释2 部分,查看两次结果的不同之处。

注释1 部分,pageData 是一个引用对象,在其中一个线程中,引用对象的值进行的变动,它会影响到 其他的线程上。注释2部分,则根据传入的参数,构造了一个线程内临时变量。

method1 和 method2 提供了两种多线程的访问方式,并且获取多线程执行后的结果集

package com.bkc.bpmp.test;import java.util.ArrayList;import java.util.Date;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.concurrent.Callable;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;public class ExecutorServiceTest{    public static void method2(List
paramslist, Map pageData) { ExecutorService pool = Executors.newFixedThreadPool(30); List
> tasks = new ArrayList
>(); for (Student stu : paramslist) { Callable c = new MyCallable(pageData, stu); // 执行任务并获取Future对象 tasks.add(c); } try { // 创建多个有返回值的任务 List
> list = pool.invokeAll(tasks); // 获取所有并发任务的运行结果 for (Future f : list) { // 从Future对象上获取任务的返回值,并输出到控制台 String string = (String)f.get(); // System.out.println(string); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } // 关闭线程池 pool.shutdown(); } public static void method1(List
paramslist, Map pageData) { ExecutorService pool = Executors.newFixedThreadPool(30); // 创建多个有返回值的任务 List
list = new ArrayList
(); for (Student stu : paramslist) { Callable c = new MyCallable(pageData, stu); // 执行任务并获取Future对象 Future f = pool.submit(c); list.add(f); } // 关闭线程池 pool.shutdown(); // 获取所有并发任务的运行结果 for (Future f : list) { // 从Future对象上获取任务的返回值,并输出到控制台 try { String string = (String)f.get(); // System.out.println(string); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static String formatDateTime(long timeMillis) { long day = timeMillis / (24 * 60 * 60 * 1000); long hour = (timeMillis / (60 * 60 * 1000) - day * 24); long min = ((timeMillis / (60 * 1000)) - day * 24 * 60 - hour * 60); long s = (timeMillis / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60); long sss = (timeMillis - day * 24 * 60 * 60 * 1000 - hour * 60 * 60 * 1000 - min * 60 * 1000 - s * 1000); return (day > 0 ? day + "," : "") + hour + ":" + min + ":" + s + "." + sss; } public static void main(String[] args) { long a = System.currentTimeMillis(); Map pageData = new HashMap<>(); pageData.put("dTime", "Test"); List
paramslist = new ArrayList<>(); for (int i = 0; i < 50; i++) { Student student = new Student("name" + i); paramslist.add(student); } method1(paramslist, pageData); System.out.println("======耗时:" + formatDateTime(System.currentTimeMillis() - a)); } }class MyCallable implements Callable
{ private Map pageData; private Student stu; public MyCallable(Map pageData, Student stu) { this.stu = stu; this.pageData = pageData; } public void print(Map
map) { try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "===" + map.toString()); } @Override public Object call() throws Exception { /** * 1 */ // pageData.put("tag", stu.getName()); // print(pageData); /** * 2 */ Map
map = new HashMap<>(); map.put("tag", stu.getName()); map.put("dTime", (String)pageData.get("dTime")); print(map); return stu.getName() + pageData.get("dTime").toString(); } }class Student{ String name; public Student() { super(); } public Student(String name) { super(); this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }

 

转载地址:http://hidfm.baihongyu.com/

你可能感兴趣的文章
oblog_4.6_SQL 语句
查看>>
通过Git WebHooks+脚本实现自动更新发布代码之shell脚本
查看>>
对象实例化、字符串的使用方法
查看>>
keepalived基于LVS实现高可用,实现web服务的高可用
查看>>
80端口被Microsoft-HTTPAPI/2.0占用的解决办法
查看>>
无法抗拒Minecraft给予超高的自由度和探索-微访谈
查看>>
数据结构之串
查看>>
我的友情链接
查看>>
lvs+keepalived+nginx+tomcat高可用高性能集群部署
查看>>
实验:搭建主DNS服务器
查看>>
org.gjt.mm.mysql.Driver与com.mysql.jdbc.Driver区别
查看>>
部署exchange2010三合一:之五:功能测试
查看>>
nginx编译安装参数
查看>>
代码托管
查看>>
第一次给ThinkPHP5核心框架提pull request的完整过程
查看>>
U-Mail邮件系统何以誉为信息整合中转枢纽
查看>>
强大的vim配置文件,让编程更随意
查看>>
崛起于Springboot2.X之配置文件详解(10)
查看>>
定时执行程序-Quartz简单实例
查看>>
【CF 应用开发大赛】MyfCMS系统
查看>>