多線程下的計數器(線程安全)

需求:最近做一個項目需要用多線程文件落地,文件名末尾按批次號命名,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);
        }
    }
}

可以看到線程池裏的不同線程共享計數器 

創建一個數據庫表,把打印出來的數據插入到主鍵字段,可以看到,正常插入,沒有重複。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章