同时运行线程太多,报内存等异常或错误 ,哈哈,分组队列就可以解决问题

xiaoxiao2021-02-28  107

今天移动电话面试那头问的一个问题,不过面试官的技能才一般,估计他还不懂怎么做,我现在把这个过程的代码贴一下

思路:

1、设置一个最大允许线程数量,首先是要通过你自身的机器承压能力和程序运行复杂情况来设定的

2、利用线程组来获取目前运行的线程数量

import java.util.LinkedList; import java.util.Queue; public class ThreadGroudTest { private static final ThreadGroup tg = new ThreadGroup("tg"); private static final int maxthread=3;//最大允许线程数量 private static final int num = 100000;//模拟跑程序 public static void main(String[] args) { //添加队列 Queue<Thread> queue = new LinkedList<Thread>(); queue.add(Thread1(tg)); queue.add(Thread2(tg)); queue.add(Thread3(tg)); queue.add(Thread4(tg)); queue.add(Thread5(tg)); queue.add(Thread6(tg)); queue.add(Thread7(tg)); queue.add(Thread8(tg)); queue.add(Thread9(tg)); queue.add(Thread10(tg)); Thread thread; int i=0; while((thread=queue.poll())!=null){ thread.start();//运行线程 while(true){ if(tg.activeCount()<=maxthread){//判断是否超过最大值   break; }else{ System.out.println("等待前..."+System.currentTimeMillis()); waits(); System.out.println("等待后..."+System.currentTimeMillis()); i++; System.out.println("超过了,需要等待!"+i+"次"); } } }   } private static void waits(){ try { Thread.sleep(100); } catch (Exception e) { e.printStackTrace(); } } public static Thread Thread1(ThreadGroup tg){ return new Thread(tg,new Runnable(){ public void run() { for(int i=0;i<num;i++){ //System.out.println("thread1:"+i); } } }); } public static Thread Thread2(ThreadGroup tg){ return new Thread(tg,new Runnable(){ public void run() { for(int i=0;i<num;i++){ //System.out.println("thread2:"+i); } } }); } public static Thread Thread3(ThreadGroup tg){ return new Thread(tg,new Runnable(){ public void run() { for(int i=0;i<num;i++){ //System.out.println("thread3:"+i); } } }); }public static Thread Thread4(ThreadGroup tg){ return new Thread(tg,new Runnable(){ public void run() { for(int i=0;i<num;i++){ //System.out.println("thread4:"+i); } } }); }public static Thread Thread5(ThreadGroup tg){ return new Thread(tg,new Runnable(){ public void run() { for(int i=0;i<num;i++){ //System.out.println("thread5:"+i); } } }); }public static Thread Thread6(ThreadGroup tg){ return new Thread(tg,new Runnable(){ public void run() { for(int i=0;i<num;i++){ //System.out.println("thread6:"+i); } } }); }public static Thread Thread7(ThreadGroup tg){ return new Thread(tg,new Runnable(){ public void run() { for(int i=0;i<num;i++){ //System.out.println("thread7:"+i); } } }); }public static Thread Thread8(ThreadGroup tg){ return new Thread(tg,new Runnable(){ public void run() { for(int i=0;i<num;i++){ //System.out.println("thread8:"+i); } } }); }public static Thread Thread9(ThreadGroup tg){ return new Thread(tg,new Runnable(){ public void run() { for(int i=0;i<num;i++){ //System.out.println("thread9:"+i); } } }); }public static Thread Thread10(ThreadGroup tg){ return new Thread(tg,new Runnable(){ public void run() { for(int i=0;i<num;i++){ //System.out.println("thread10:"+i); } } }); } }

运行结果是

等待前...1493968016581 等待后...1493968016681 超过了,需要等待!1次 等待前...1493968016681 等待后...1493968016782 超过了,需要等待!2次

适当调整模拟跑程序数量,有时候可能不输出,有时候还可能输出

等待前...1493968300130 等待后...1493968300231 超过了,需要等待!1次

说明程序是OK的l

转载请注明原文地址: https://www.6miu.com/read-26768.html

最新回复(0)