多线程编程:多线程并发制单的开发记录【一】
2017-10-11 11:48
351 查看
最近天气很冷,记得保暖,我在帝都向各位问好。一次舒服的小长假回来,是不是都忘了增删改查怎么敲了,那就赶紧粘贴一会儿吧,别等着公司把你优化掉。
好了,老习惯,首先给各位脑补一下多线程必备的知识。
View Code
制单:
再次强调:加锁的时候一定要掌握好锁的粒度,不然会影响并发效率。
3、模拟多通道进行数据采集。
后期继续更新多线程并发的文章,因为被这家伙给看上了,不得不深入剖析了,一直在学习的路上。
好了,老习惯,首先给各位脑补一下多线程必备的知识。
进程和线程:
下图是在来自知乎用户的解释,个人感觉狠到位public class InitQueue { private static final Logger logger = LoggerFactory.getLogger(MultiThreadTask_VW_AD.class); /** * 并发队列 */ private static Queue<String> queue = null; //初始化并发队列 private static void initQueue(){ logger.info("初始化并发队列:{}"); if(queue == null){ queue = new ConcurrentLinkedQueue<String>(); //并发队列 } String tasklist = "JF1GH78F18G03614,JF1SH95F6AG110830,JF1SJ94D7DG010387333,JF1SH92F9CG26924,JF1SH92F5BG215090,JF1SH92F5BG222556,JF1SH92F4CG279994,JF1BR96D7CG114298,JF1BR96D0BG078632,JF1SH95F9AG094011,JF1SH98FXAG186997,JF1BM92D8BG022510,JF1BM92DXAG013855,JF1BM94D8EG0366"; String[] split = tasklist.split(","); List<String> task = Arrays.asList(split); //数组转集合 queue.addAll(task); //按照集合中元素的顺序将集合中全部元素放进队列 } //对外提供一个任务队列 public static Queue<String> getQueue(){ initQueue(); return queue; } }
View Code
制单:
public class MultiThreadTask_VW_AD implements Runnable,Serializable{ private static final Logger logger = LoggerFactory.getLogger(MultiThreadTask_VW_AD.class); private static final long serialVersionUID = 0; private static final Object lock = new Object(); //静态锁,任务队列在某一时刻只能由一个线程操作 private static List<String> errorVinList = new ArrayList<>(); //存放不合理VIN码的集合 private static Queue<String> taskQueue = InitQueue.getQueue(); //任务队列 //数据采集 @Override public void run() { synchronized (lock) { int queueSize = taskQueue.size(); if(queueSize > 0){ logger.info("任务队列目前有{}个任务",queueSize); String thisVin = taskQueue.poll(); logger.info("当前任务VIN码:{}",thisVin); if(thisVin.length() == 17){ System.out.println("采集任务已完成【"+Thread.currentThread().getName()+"】"); }else{ System.out.println("不进行采集【"+Thread.currentThread().getName()+"】"); errorVinList.add(thisVin); System.err.println("未采集的VIN码有:"+errorVinList); } }else{ logger.info("任务队列目前无任务"); } } } }
再次强调:加锁的时候一定要掌握好锁的粒度,不然会影响并发效率。
3、模拟多通道进行数据采集。
public class ThreadPoolController { private static final Logger logger = LoggerFactory.getLogger(ThreadPoolController.class); /** * 一汽大众、奥迪多并发进行数据采集: */ @Test public void vwadTest(){ //加载线程池配置文件 ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:springs/applicationContext-threadpool.xml"); //通过applicationContext获取异步线程池对象threadPoolTaskExecutor ThreadPoolTaskExecutor threadPool = (ThreadPoolTaskExecutor) ctx.getBean("threadPoolTaskExecutor"); //获取品牌制单业务对象(由spring管理的) MultiThreadTask_VW_AD multiThreadTask_VW_AD = (MultiThreadTask_VW_AD) ctx.getBean("multiThreadTask_VW_AD"); for(int i=1; i<=15; i++){ threadPool.execute(multiThreadTask_VW_AD); } }
后期继续更新多线程并发的文章,因为被这家伙给看上了,不得不深入剖析了,一直在学习的路上。
相关文章推荐
- 多线程编程:多线程并发制单的开发记录【一】
- 探索并发编程(五)------Java多线程开发技巧
- 探索并发编程(五)------Java多线程开发技巧
- Linux系统开发11 Socket API编程2 多进程 多线程 高并发处理
- 探索并发编程(五)------Java多线程开发技巧
- 探索并发编程(五)------Java多线程开发技巧
- 探索并发编程(五)------Java多线程开发技巧
- Java多线程编程(八)-并发编程原理(Java多线程开发技巧)
- 探索并发编程(五)------Java多线程开发技巧
- 多线程开发的捷径:构建Java并发模型框架
- Java多线程编程核心技术(二)对象及变量的并发访问
- Java 多线程与并发编程专题
- 【3】Java并发编程:多线程基本概念
- FM并发编程练习:改写苏飞的C#多线程网站压力测试程序
- 【Java多线程编程核心技术】2.对象及变量的并发访问(下)-笔记总结
- iOS开发探索-多线程(NSThread、NSOperation、GCD)编程浅谈
- Linux并发服务器编程之多线程并发服务器
- Java 多线程编程之一 进程与线程,并发和并行的区别:吃馒头的比喻
- 网络编程与并发-FTP开发
- 实战体会Java的多线程编程-Java基础-Java-编程开发