当前位置: 首页 > news >正文

关于多线程的参数问题

体会多线程的参数问题,可以用下面的代码测试,分别放开 注释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<Student> paramslist, Map pageData)
    {
        
        ExecutorService pool = Executors.newFixedThreadPool(30);
        List<Callable<Object>> tasks = new ArrayList<Callable<Object>>();
        for (Student stu : paramslist)
        {
            Callable c = new MyCallable(pageData, stu); // 执行任务并获取Future对象
            tasks.add(c);
        }
        
        try
        {
            // 创建多个有返回值的任务
            List<Future<Object>> 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<Student> paramslist, Map pageData)
    {
        
        ExecutorService pool = Executors.newFixedThreadPool(30);
        // 创建多个有返回值的任务
        List<Future> list = new ArrayList<Future>();
        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<Student> 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<Object>
{
    private Map pageData;
    private Student stu;
    
    public MyCallable(Map pageData, Student stu)
    {
        this.stu = stu;
        this.pageData = pageData;
    }
    
    public void print(Map<String, String> 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<String, String> 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;
    }
    
}

 

相关文章:

  • sudo、磁盘结构、echo,awk,python计算、RAID0和1的区别
  • jsp页面按时间排序
  • 18载艰苦创业,曾动念房地产转型,讯飞的江湖夜雨和桃李春风
  • UML--------------------类图
  • 如何使用MACS进行peak calling
  • 使用mysqladmin命令修改MySQL密码与忘记密码
  • text-decoration与color属性
  • reactive streams与观察者模式
  • 面试技术题笔记
  • 从String源码看Java中的编码
  • 怎样让html加载完毕后加载js代码
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Vmware虚拟机的单用户模式
  • Flask学习笔记(2)-login_page
  • shell安全防范———慎将当前目录.加入PATH~~~之~隔壁老王来敲门
  • 【译】理解JavaScript:new 关键字
  • bootstrap创建登录注册页面
  • canvas 高仿 Apple Watch 表盘
  • Java比较器对数组,集合排序
  • JSONP原理
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Python 基础起步 (十) 什么叫函数?
  • quasar-framework cnodejs社区
  • react 代码优化(一) ——事件处理
  • SpingCloudBus整合RabbitMQ
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • linux 淘宝开源监控工具tsar
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​Spring Boot 分片上传文件
  • # .NET Framework中使用命名管道进行进程间通信
  • # 飞书APP集成平台-数字化落地
  • #pragma once与条件编译
  • #Z2294. 打印树的直径
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (差分)胡桃爱原石
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .gitattributes 文件
  • .NET Standard 的管理策略
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .Net(C#)常用转换byte转uint32、byte转float等
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • @软考考生,这份软考高分攻略你须知道
  • [ Linux Audio 篇 ] 音频开发入门基础知识
  • [ 数据结构 - C++]红黑树RBTree
  • [ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证
  • [20170705]diff比较执行结果的内容.txt
  • [2024] 十大免费电脑数据恢复软件——轻松恢复电脑上已删除文件
  • [BUUCTF 2018]Online Tool(特详解)
  • [C# 开发技巧]如何使不符合要求的元素等于离它最近的一个元素
  • [C#] 我的log4net使用手册