需求:最近做一个项目需要用多线程文件落地,文件名末尾按批次号命名,file1..file2 3 4 ....
开3个固定大小的线程池,不断往里面加任务,每个线程共用一个计数器,争抢计数,从1开始递增。
package com.demo.thread;
import java.util.concurrent.atomic.AtomicInteger;
public class MyCounter {
private AtomicInteger batchNum = new AtomicInteger(0);
public AtomicInteger getBatchNum() {
return batchNum;
}
public void setBatchNum(AtomicInteger batchNum) {
this.batchNum = batchNum;
}
}
public class TestA extends Thread {
private MyCounter myCounter;
public TestA(MyCounter myCounter){
this.myCounter = myCounter;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"---"+myCounter.getBatchNum().incrementAndGet());
}
}
import com.demo.thread.MyCounter;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Test {
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(3);
long start = System.currentTimeMillis();
MyCounter counter = new MyCounter();
while (System.currentTimeMillis() - start <10) {
TestA t = new TestA(counter);
executorService.execute(t);
}
}
}
可以看到线程池里的不同线程共享计数器
创建一个数据库表,把打印出来的数据插入到主键字段,可以看到,正常插入,没有重复。