多线程处理并发
这个面试题考察的是如何设计并发,但是,这里并没有说“发工资动作”需要用时多少,所以,这里分情况讨论;
假设发工资动作非常快,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
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号