您的位置: 旅游网 > 生活

Java语言深入 多线程程序模型研究(3)

发布时间:2019-09-13 20:34:02

以上程序需要4个参数,输入javaPortScanner10.1.1.182110000100运行(第4个参数是线程数),结果前两个程序一样,但是速度比第一个要快,可能比第二个要慢一些。

第3个程序是把端口作为“池”中的对象,下面我们看第4个实现方式,把“池”里面的对象定义成是线程类,把具体的任务定义成”池“中线程类的参数。第4个程序有2个文件组成,分别是ThreadPool.java和PortScannerByThreadPool.java.

ThreadPool.java文件内容如下:

-----------------------------------------------------------

importjava.util.LinkedList;

publicclassThreadPool{

privatefinalintnThreads;

privatefinalPoolWorker[]threads;

privatefinalLinkedListqueue;

publicThreadPool(intnThreads){

this.nThreads=nThreads;

queue=newLinkedList();

threads=newPoolWorker[nThreads];

for(inti=0;i<nThreads;i++){

threads[i]=newPoolWorker();

threads[i].start();

}

}

publicvoidexecute(Runnabler){

synchronized(queue){

queue.addLast(r);

queue.notifyAll();

}

}

privateclassPoolWorkerextendsThread{

publicvoidrun(){

Runnabler;

while(true){

synchronized(queue){

while(queue.isEmpty()){

try{

queue.wait();

}catch(InterruptedExceptionignored){

}

}

r=(Runnable)queue.removeFirst();

}

try{

r.run();

}

catch(RuntimeExceptione){

}

}

}

}

}

------------------------------------------------------------------------------------------------------------------

在ThreadPool.java文件中定义了2个类:ThreadPool和PoolWorker。ThreadPool类中的nThreads变量表示线程数,PoolWorker数组类型的threads变量表示线程池中的“工人”,这些“工人”的工作就是一直循环处理通过queue.addLast(r)加入到“池”中的任务。

PortScannerByThreadPool.java文件内容如下:

-------------------------------------------------------------------------------------------------------------------

importjava.io.IOException;

importjava.net.InetAddress;

importjava.net.Socket;

publicclassPortScannerByThreadPool{

publicstaticvoidmain(String[]args){

Stringhost=null;

intbeginport=1;

intendport=65535;

intnThreads=100;

try{

host=args[0];

beginport=Integer.parseInt(args[1]);

endport=Integer.parseInt(args[2]);

nThreads=Integer.parseInt(args[3]);

if(beginport<=0||endport>=65536||beginport>endport){

thrownewException("Portisillegal");

}

}catch(Exceptione){

System.out.println("Usage:javaPortScannerSingleThreadhostbeginportendportnThreads");

System.exit(0);

}

ThreadPooltp=newThreadPool(nThreads);

for(inti=beginport;i<=endport;i++){

Scannerps=newScanner(host,i);

tp.execute(ps);

}

}

}

查看本文来源

小儿呕吐吐奶溢乳有什么区别
宝宝脸部发黄怎么回事
男人夜晚尿频是什么原因
宝宝反复发烧怎么回事
猜你会喜欢的
猜你会喜欢的