import java.util.Vector;
public class ThreadPool implements Runnable{
public final static int DEFAULT_MINIMUM_SIZE=0;
public final static int DEFAULT_MAXIMUM_SIZE=Integer.MAX_VALUE;
public final static int DEFAULT_RELEASE_RELAY=10*1000;
protected int minimumsize;
protected int maximumsize;
protected int currentsize;
protected int availablethread;
protected long releasedelay;
protected Vector tasklist;
public ThreadPool(int minsize,int maxsize,long delay)
{
minimumsize=minsize;
maximumsize=maxsize;
releasedelay=delay;
tasklist=new Vector(100);
availablethread=0;
}
public ThreadPool()
{
this(DEFAULT_MINIMUM_SIZE,DEFAULT_MAXIMUM_SIZE,DEFAULT_RELEASE_RELAY);
}
public synchronized int getminimumsize(){
return minimumsize;
}
public synchronized void setminimumsize(int minsize)
{
minimumsize=minsize;
}
public synchronized int getmaximumsize(){
return maximumsize;
}
public synchronized void setmaximumsize(int maxsize)
{
minimumsize=maxsize;
}
public synchronized void setreleasedelay(long delay)
{
releasedelay=delay;
}
public synchronized long getreleasedelay()
{
return releasedelay;
}
public synchronized void addTask(Runnable runnable)
{
tasklist.addElement(runnable);
if(availablethread>0)
{
this.notify();
}
else{
if(currentsize<maximumsize){
Thread t=new Thread(this);
currentsize++;
t.start();
}
}
}
public void run()
{
Runnable task;
while(true)
{
synchronized (this){
if(currentsize>maximumsize)
{
currentsize--;
break;
}
task=getnexttask();
if(task==null)
{
try{
availablethread++;
wait(releasedelay);
availablethread--;
}catch(InterruptedException ie){};
task=getnexttask();
if(task==null){
if(currentsize<=maximumsize)
{
continue;
}
currentsize--;
break;
}
}
}
try{
task.run();
}catch(Exception e){
System.out.println("Uncaught exception!");
e.printStackTrace(System.err);
}
}
}
protected synchronized Runnable getnexttask()
{
Runnable task=null;
if(tasklist.size()>0)
{
task=(Runnable)(tasklist.elementAt(0));
tasklist.removeElementAt(0);
}
return task;
}
public static void main(String args[])
{
ThreadPool tp=new ThreadPool(5,10,500);
System.out.println(tp.availablethread);
Runnable mytask=new Runnable(){
public void run(){
System.out.println("New Thread!");
}
};
tp.addTask(mytask);
Thread tt=new Thread(mytask);
tt.stop();
}
}1. 运行后的CMD模式下的线程怎么停不下来?(即没有 press any key continue....),stop好象没用
2. System.out.println(tp.availablethread);怎么显示为0 ,不是还有5个可用线程吗
3. 在main方法中我定义两个task,mytask1和mytask2, 如何实现交替执行?
public class ThreadPool implements Runnable{
public final static int DEFAULT_MINIMUM_SIZE=0;
public final static int DEFAULT_MAXIMUM_SIZE=Integer.MAX_VALUE;
public final static int DEFAULT_RELEASE_RELAY=10*1000;
protected int minimumsize;
protected int maximumsize;
protected int currentsize;
protected int availablethread;
protected long releasedelay;
protected Vector tasklist;
public ThreadPool(int minsize,int maxsize,long delay)
{
minimumsize=minsize;
maximumsize=maxsize;
releasedelay=delay;
tasklist=new Vector(100);
availablethread=0;
}
public ThreadPool()
{
this(DEFAULT_MINIMUM_SIZE,DEFAULT_MAXIMUM_SIZE,DEFAULT_RELEASE_RELAY);
}
public synchronized int getminimumsize(){
return minimumsize;
}
public synchronized void setminimumsize(int minsize)
{
minimumsize=minsize;
}
public synchronized int getmaximumsize(){
return maximumsize;
}
public synchronized void setmaximumsize(int maxsize)
{
minimumsize=maxsize;
}
public synchronized void setreleasedelay(long delay)
{
releasedelay=delay;
}
public synchronized long getreleasedelay()
{
return releasedelay;
}
public synchronized void addTask(Runnable runnable)
{
tasklist.addElement(runnable);
if(availablethread>0)
{
this.notify();
}
else{
if(currentsize<maximumsize){
Thread t=new Thread(this);
currentsize++;
t.start();
}
}
}
public void run()
{
Runnable task;
while(true)
{
synchronized (this){
if(currentsize>maximumsize)
{
currentsize--;
break;
}
task=getnexttask();
if(task==null)
{
try{
availablethread++;
wait(releasedelay);
availablethread--;
}catch(InterruptedException ie){};
task=getnexttask();
if(task==null){
if(currentsize<=maximumsize)
{
continue;
}
currentsize--;
break;
}
}
}
try{
task.run();
}catch(Exception e){
System.out.println("Uncaught exception!");
e.printStackTrace(System.err);
}
}
}
protected synchronized Runnable getnexttask()
{
Runnable task=null;
if(tasklist.size()>0)
{
task=(Runnable)(tasklist.elementAt(0));
tasklist.removeElementAt(0);
}
return task;
}
public static void main(String args[])
{
ThreadPool tp=new ThreadPool(5,10,500);
System.out.println(tp.availablethread);
Runnable mytask=new Runnable(){
public void run(){
System.out.println("New Thread!");
}
};
tp.addTask(mytask);
Thread tt=new Thread(mytask);
tt.stop();
}
}1. 运行后的CMD模式下的线程怎么停不下来?(即没有 press any key continue....),stop好象没用
2. System.out.println(tp.availablethread);怎么显示为0 ,不是还有5个可用线程吗
3. 在main方法中我定义两个task,mytask1和mytask2, 如何实现交替执行?
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货