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 ,时间可以自己加一下,统计一下