java 线程实现全家数豆子情景

文章描述了一个使用Java实现的多线程场景,模拟全家五口人数10000颗豆子,不同角色(线程)数豆子速度各异,展示了如何使用ExecutorService、AtomicInteger和ThreadLocal进行并发控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java 线程实现全家数豆子情景

背景

之前有个作业是,全家五口人,爷爷,奶奶,爸爸,妈妈,孩子,一起数10000颗豆子,一共用多少时间,后来在某个文章看到有个大神有java线程实现了,具体思路忘记了。

实现

五个人就是五个线程,但是每个人数豆子的时间是不一样的,那就让每个线程睡的时间不一样

定义一个时间 long t

豆子的总数是一定的,所以定义一个总数

AtomicInteger atomicInteger = new AtomicInteger(50);

然后就可以开始数了

代码

@Slf4j
public class CountBeans {


    public static void main(String[] args) throws InterruptedException {
        long t1 = System.currentTimeMillis();
        ExecutorService executorService = Executors.newFixedThreadPool(5);//5个线程5个人
        AtomicInteger atomicInteger = new AtomicInteger(50);
        ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
        executorService.execute(new Run(100,atomicInteger,"爸爸",threadLocal));
        executorService.execute(new Run(150,atomicInteger,"妈妈",threadLocal));
        executorService.execute(new Run(500,atomicInteger,"孩子",threadLocal));
        executorService.execute(new Run(400,atomicInteger,"爷爷",threadLocal));
        executorService.execute(new Run(450,atomicInteger,"奶奶",threadLocal));
        executorService.shutdown();
        executorService.awaitTermination(160, TimeUnit.MINUTES);
        long t2 = System.currentTimeMillis();
        log.info("时间 {}",t2-t1);

    }


}

@Slf4j
class Run implements Runnable {
    String name;
    long t;
    AtomicInteger atomicInteger;
    ThreadLocal<Integer> threadLocal;
    public Run(long t,AtomicInteger atomicInteger,String name,ThreadLocal<Integer> threadLocal) {
        log.info("{} 开始数了....",name);
        this.t = t;
        this.atomicInteger = atomicInteger;
        this.name = name;
        this.threadLocal =  threadLocal;
    }

    @Override
    public void run() {
        while(atomicInteger.get() >0){
            if(null == threadLocal.get()){
                threadLocal.set(0);
            }
            log.info("{} 开始数了 {} 个豆子",name,threadLocal.get());
            atomicInteger.addAndGet(-1);
            threadLocal.set(threadLocal.get()+1);

            try{
                Thread.sleep(t);
            }catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        log.info("{} 数完了 --总共数了 {} 豆子",name,threadLocal.get());


    }
}

最后结果

在这里插入图片描述

我这里总数是50 ,时间可以自己加一下,统计一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值