java多线程之批量操作

来源:互联网 发布:stl源码剖析 知乎 编辑:程序博客网 时间:2024/06/06 10:06

第一次写博客,工作一年多,属于新手类型,错误和不足之处大家多多提醒,谢谢啦。

作用简介:

 最直观的效果就是大大减少了操作时间。

1.首先建立测试实体类

package com.ncq.entity;import java.io.Serializable;public class Student implements Serializable{private static final long serialVersionUID = 1L;private Long id;private String name;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}
2.建立实现业务的类

package com.ncq.service.impl;import java.util.List;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import com.ncq.entity.Student;import com.ncq.service.TestService;public class TestServiceImpl implements TestService{private ExecutorService executor = Executors.newFixedThreadPool(10);//给定线程池数量private static final int MAX_DEAL = 50;//对多数据进行分组,50条一组,一组使用一个线程进行执行@Overridepublic void addList(List<Student> list) {//判断数据是否为空if(list == null || list.isEmpty()){return;}int times = (list.size() + MAX_DEAL - 1) / MAX_DEAL;        CountDownLatch countDownLatch = new CountDownLatch(times);//一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。        try {         for (int i = 0; i < times; i++) {                 if (i == times - 1) {                 executor.execute(new addListRunnable(list.subList(i * MAX_DEAL, list.size()), countDownLatch));//调用业务逻辑                 } else {                 executor.execute(new addListRunnable(list.subList(i * MAX_DEAL, (i + 1) * MAX_DEAL), countDownLatch));                 }             }             countDownLatch.await();//一个线程(或者多个), 等待另外N个线程完成某个事情之后才能执行} catch (Exception e) {e.printStackTrace();}       }private class addListRunnable implements Runnable{private List<Student> list;private CountDownLatch countDownLatch;public addListRunnable(List<Student> list,CountDownLatch countDownLatch){super();this.list = list;this.countDownLatch = countDownLatch;}@Overridepublic void run() {try {//模拟业务执行,这里并没有对list进行操作Thread.sleep(1000);System.out.println("当前线程为"+Thread.currentThread().getId());//输出当前线程id} catch (Exception e) {e.printStackTrace();}finally {                countDownLatch.countDown();//完成一次操作,计数减一              }}}}

</pre><p></p><pre>
3.测试main方法

package com.ncq.test;import java.util.ArrayList;import java.util.List;import com.ncq.entity.Student;import com.ncq.service.impl.TestServiceImpl;public class Main {public static void main(String[] args) {List<Student> list = new ArrayList<Student>();for (int i = 0; i < 1010; i++) {Student stu = new Student();stu.setId(Long.valueOf(i));stu.setName("张三"+i);list.add(stu);}TestServiceImpl s = new TestServiceImpl();s.addList(list);System.out.println("==执行了完成==");}}
写完收工,不足的地方请大牛指导


0 0