您的位置:首页 > 编程语言

多线程编程:多线程并发制单的开发记录【一】

2017-10-11 11:48 351 查看
最近天气很冷,记得保暖,我在帝都向各位问好。一次舒服的小长假回来,是不是都忘了增删改查怎么敲了,那就赶紧粘贴一会儿吧,别等着公司把你优化掉。

好了,老习惯,首先给各位脑补一下多线程必备的知识。

进程和线程:

下图是在来自知乎用户的解释,个人感觉狠到位

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);
}

}


后期继续更新多线程并发的文章,因为被这家伙给看上了,不得不深入剖析了,一直在学习的路上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: