多线程处理并发

这个面试题考察的是如何设计并发,但是,这里并没有说“发工资动作”需要用时多少,所以,这里分情况讨论;

假设发工资动作非常快,1μs(微妙)内可给一个人发送
直接for(int i = 0; i < 100000; i++)即可,总耗时:100000/1000=100ms(毫秒)=0.1s(秒)
假设发工资动作耗时1ms
直接for(int i = 0; i < 100000; i++)的话,总耗时:100000/1000=100s>1min,不能满足需求了,这里再开一个线程,即,两个线程可将时间缩短到50s,符合1分钟的需求。
假设发工资耗时1s
当发工资耗时1s时,单线程在1分钟内只能发送60个人的工资,如果直接考虑开线程的话,100000/60=1667个线程。
假设给的机器时1个CPU,4个Core的,那么同时开1667个线程的话,这里写了一个简单代码,模拟了1个CPU,4个Core时,启1000个线程的情况:

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
* @author Wayss.
* @date 2019/7/9.
*/
public class ThreadPoolDemo {

public static void main(String [] args) {

ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(0, 2000, 1, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(1));

for (int i = 0; i < 1000; i++) {
WorkThread workThread = new WorkThread();
threadPoolExecutor.execute(workThread);
}
System.out.println("threadPoolExecutor.shutdown()");
threadPoolExecutor.shutdown();
}
}

class WorkThread implements Runnable {

public void run() {
try {

System.out.println(Thread.currentThread().getName() + "===执行开始");
//方案一:模拟等待用sleep,不占用CPU
TimeUnit.SECONDS.sleep(10);
//方案二:模拟等待用for,占用CPU
//for (long i = 0; i < 9999999999L; i++) ;
System.out.println(Thread.currentThread().getName() + "===执行结束");
} catch (Exception e) {
e.printStackTrace();
}
}
}

发现:当执行方案一时,虽然每个线程需要10s,但是CPU的使用率仍然比较低;但当执行方案二时,CPU飙升,电脑已经相当卡顿了。

因此,可以得出结论,如果发工资线程,大量占用CPU计算资源,那么1个CPU,4个Core的机器肯定不能支持,需要加机器;如果发工资线程时间耗费在等待IO上面,那么1个CPU,4个Core是可以启动2000个线程的。
————————————————
版权声明:本文为CSDN博主「Wayss_S」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq1332479771/article/details/90597201

posted @ 2022-03-18 23:00  志鸿鸣  阅读(183)  评论(0)    收藏  举报