需求:最近做一個項目需要用多線程文件落地,文件名末尾按批次號命名,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);
}
}
}
可以看到線程池裏的不同線程共享計數器
創建一個數據庫表,把打印出來的數據插入到主鍵字段,可以看到,正常插入,沒有重複。