| 導購 | 订阅 | 在线投稿
分享
 
 
 

Java語言深入 多線程程序模型研究

來源:互聯網網民  2008-05-31 12:10:22  評論

多線程是較複雜程序設計過程中不可缺少的一部分。爲了提高應用程序運行的性能,采用多線程的設計是一種比較可行的方案。本文通過介紹使用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){

}

}

}

QQRead.com 推出數據恢複指南教程 數據恢複指南教程

數據恢複故障解析

常用數據恢複方案

硬盤數據恢複教程

數據保護方法

數據恢複軟件

專業數據恢複服務指南

 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
多線程是較複雜程序設計過程中不可缺少的一部分。爲了提高應用程序運行的性能,采用多線程的設計是一種比較可行的方案。本文通過介紹使用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){ } } } QQRead.com 推出數據恢複指南教程 數據恢複指南教程 數據恢複故障解析 常用數據恢複方案 硬盤數據恢複教程 數據保護方法 數據恢複軟件 專業數據恢複服務指南
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 
 熱帖排行
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有