第一种实现线程池的方法是:创建一个”池“,在”池“中增加要处理的数据对象,然后创建一定数量的线程,这些线程对”池“中的对象进行处理。当”池“是空的时候,每个线程处于等待状态;当往”池“里添加一个对象,通知所有等待的线程来处理(当然一个对象只能有一个线程来处理)。
第二种方法是:同样创建一个”池“,但是在”池“中放的不是数据对象,而是线程,可以把”池“中的一个个线程比喻成一个个”工人“,当没有任务的时候,”工人“们严阵以待;当给”池“添加一个任务后,”工人“就开始处理并直到处理完成。
在第3个程序中,定义了List类型的entries作为“池”,这个“池”用来保存需要扫描的端口,List中的元素必须是Object类型,不能用基本数据类型int往池里添加,而需要用使用Integer。在processMethod()方法中,首先就启动一定数量的PortThread线程,同时在while循环中通过entries.add(0, new Integer(port))往“池”里添加对象。在PortThread类的run()方法中通过entry = (Integer)entries.remove(entries.size()-1);取得“池”中的对象,转换成int后传递给Socket构造方法。 第3个程序如下: ----------------------------------------------------------------------------------------------------------------------- import java.io.IOException; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; import java.util.Collections; import java.util.LinkedList; import java.util.List;
public class PortScanner { private List entries = Collections.synchronizedList(new LinkedList()); //这个”池“比较非凡 int numofthreads; static int port; int beginport; int endport; InetAddress remote = null; public boolean isFinished(){ if(port >= endport){ return true; }else{ return false; } } PortScanner(InetAddress addr, int beginport, int endport, int numofthreads){ this.remote = addr; this.beginport = beginport; this.endport = endport; this.numofthreads = numofthreads; } public void processMethod(){ for(int i = 0; i < numofthreads; i ){ //创建一定数量的线程并运行 Thread t = new PortThread(remote, entries, this); t.start(); } port = beginport; while(true){ if(entries.size() > numofthreads){ try{ Thread.sleep(1000); //”池“中的内容太多的话就sleep }catch(InterruptedException ex){ } continue; } synchronized(entries){ if(port > endport) break; entries.add(0, new Integer(port)); //往”池“里添加对象,需要使用int对应的Integer类 entries.notifyAll(); port ; } } } public static void main(String[] args) { String host = null; int beginport = 1; int endport = 65535; int nThreads = 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){ throw new Exception("Port is illegal"); } }catch(Exception e){ System.out.println("Usage: java PortScannerSingleThread host beginport endport nThreads"); System.exit(0); } try{ PortScanner scanner = new PortScanner(InetAddress.getByName(host), beginport, endport, nThreads); scanner.processMethod(); }catch(UnknownHostException ex){ } } }
class PortThread extends Thread{ private InetAddress remote; private List entries; PortScanner scanner; PortThread(InetAddress add, List entries, PortScanner scanner){ this.remote = add; this.entries = entries; this.scanner = scanner; } public void run(){ Integer entry; while(true){ synchronized(entries){ while(entries.size() == 0){ if(scanner.isFinished()) return; try{ entries.wait(); //”池“里没内容就只能等了 }catch(InterruptedException ex){ } } entry = (Integer)entries.remove(entries.size()-1); //把”池“里的东西拿出来进行处理 } Socket s = null; try{ s = new Socket(remote, entry.intValue()); System.out.println("The port of " entry.toString() " of the remote " remote " is opened."); }catch(IOException e){ }finally{
共4页: 上一页 [1] 2 [3] [4] 下一页 |