Java語言深入 多執行緒程式模型研究(轉)

ba發表於2007-08-17
Java語言深入 多執行緒程式模型研究(轉)[@more@]多執行緒是較複雜程式設計過程中不可缺少的一部分。為了提高應用程式執行的效能,採用多執行緒的設計是一種比較可行的方案。本文透過介紹使用Java編寫的掃描計算機埠的例項,來說明多執行緒設計中應注意的問題,以及得出經常使用的多執行緒模型。

本文要求讀者具備一定的Java語言基礎,對Socket有一定的瞭解。本文的所有程式在Java SDK 1.4.2編譯透過並能正常執行。

現在,我們需要對一臺主機掃描其埠,找出哪些埠是open的狀態。我們先採用單執行緒進行處理,程式程式碼如下:
-------------------------------------------------------------------------------------------------------
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

public class PortScannerSingleThread {
public static void main(String[] args) {
String host = null; //第一個引數,目標主機。
int beginport = 1; //第二個引數,開始埠。
int endport = 65535; //第三個引數,結束埠。
try{
host = args[0];
beginport = Integer.parseInt(args[1]);
endport = Integer.parseInt(args[2]);
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");
System.exit(0);
}


for (int i = beginport; i <= endport; i++) {
try {
Socket s = new Socket(host, i);
System.out.println("The port " + i + " is opened at " + host);
}catch (UnknownHostException ex) {
System.err.println(ex);
break;
}catch (IOException ex) {
}
}
}
}
--------------------------------------------------------------------------------------------------------
在以上程式中,透過java.net.Socket類來識別埠是否是open狀態。程式接受3個引數,第一個引數是主機IP,第二和第三個引數是需要掃描的起始和中止的埠號(1~65535)。本程式(java PortScannerSingleThread 10.1.1.1 1 1000)執行結果如下:
The port 25 is opened at 10.1.1.182
The port 110 is opened at 10.1.1.182
The port 135 is opened at 10.1.1.182
...

但是,以上程式執行效率實在不敢恭維,把目標主機埠掃描一遍需要十幾分鍾甚至更長,估計沒有哪個使用者可以忍受這樣的效率。

所以,提高程式處理效率是必須的,下面的程式透過多執行緒的方法來進行處理。程式程式碼如下:
----------------------------------------------------------------------------------------------------------
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

public class PortScannerMultiThread {
public static void main(String[] args) {
String host = null;
int beginport = 1;
int endport = 65535;
try{
host = args[0];
beginport = Integer.parseInt(args[1]);
endport = Integer.parseInt(args[2]);
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");
System.exit(0);
}


for (int i = beginport; i <= endport; i++) {
PortProcessor pp = new PortProcessor(host,i); //一個埠建立一個執行緒
pp.start();
}
}
}

class PortProcessor extends Thread{
String host;
int port;

PortProcessor(String host, int port){
this.host = host;
this.port = port;
}

public void run(){
try{
Socket s = new Socket(host,port);
System.out.println("The port " + port + " is opened at " + host);
}catch(UnknownHostException ex){
System.err.println(ex);
}catch(IOException ioe){
}
}
}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-963582/,如需轉載,請註明出處,否則將追究法律責任。

相關文章