工具Import 、测试类:
将list分隔成多个,给多个线程处理
package thread;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class Import {
private CountDownLatch countDownLath;
public void ImportData(List list,int threadNum) throws InterruptedException {
int startIndex ,endIndex;//子List的下标
List newList;
int count=0;//每个子List处理数量
if(list.size()%threadNum==0){
count=list.size()%threadNum;
}else{
count=(list.size()/threadNum)+1;
}
countDownLath=new CountDownLatch(threadNum);
ScheduledThreadPoolExecutor poolExecutor = new ScheduledThreadPoolExecutor(threadNum);
ExecutorService e=Executors.newFixedThreadPool(threadNum);
//截取子List,给TaskThread执行
for(int i=0;i<threadNum;i++){
if(i+1==threadNum){
startIndex=i*count;
endIndex=list.size();
}else{
startIndex=i*count;
endIndex=(i+1)*count;
}
newList=list.subList(startIndex, endIndex);
TaskThread thread=new TaskThread(newList, countDownLath);
// e.execute(thread);
poolExecutor.scheduleAtFixedRate(thread, 1,2, TimeUnit.SECONDS);//这个方法持续进行需要捕获线程run中的异常
}
Thread.sleep(5000);
poolExecutor.shutdown();//释放线程池
e.shutdown();//释放线程池
}
public static void main(String[] args) throws InterruptedException {
List list=new ArrayList<Integer>();
int threadNum=2;
for(int i=1;i<=11;i++){
list.add(i);
}
Import im=new Import();
im.ImportData(list, threadNum);
im.countDownLath.await();// 调用await方法阻塞当前线程,等待子线程完成后在继续执行
System.out.println("main thread=====================");
}
}
TaskThread线程类
package thread;
import java.util.List;
import java.util.concurrent.CountDownLatch;
public class TaskThread implements Runnable{
private List list;
private CountDownLatch countDownL;
public TaskThread(List list, CountDownLatch countDownL) {
super();
this.list = list;
this.countDownL = countDownL;
}
@Override
public void run() {
try {
for (Object object : list) {
//业务逻辑
System.out.println(Thread.currentThread().getId() + "=="
+ object.toString());
}
// int i = 1 / 0;
System.out.println(Thread.currentThread().getId() + "==run list end");
} catch (Exception e) {
System.out.println(Thread.currentThread().getId() +" "+e.getMessage());
}finally{
countDownL.countDown();//发出线程任务完成的信号 ,计数减1
}
}
}