多线程下的计数器(线程安全)

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

可以看到线程池里的不同线程共享计数器 

创建一个数据库表,把打印出来的数据插入到主键字段,可以看到,正常插入,没有重复。 

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