今天移动电话面试那头问的一个问题,不过面试官的技能才一般,估计他还不懂怎么做,我现在把这个过程的代码贴一下
思路:
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