Java語言深入 多執行緒程式模型研究(轉)
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){
}
}
}
本文要求讀者具備一定的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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 深入理解多執行緒(二)—— Java的物件模型執行緒Java物件模型
- C語言 之 多執行緒程式設計C語言執行緒程式設計
- 深入淺出Java多執行緒Java執行緒
- 深入淺出Java多執行緒(十二):執行緒池Java執行緒
- go語言多執行緒入門筆記-執行緒同步Go執行緒筆記
- Java多執行緒記憶體模型Java執行緒記憶體模型
- 深入淺出Java多執行緒(十):CASJava執行緒
- 深入淺出Java多執行緒(十一):AQSJava執行緒AQS
- 深入理解多執行緒程式設計執行緒程式設計
- Java多執行緒-程式執行堆疊分析Java執行緒
- 使用委託開啟多執行緒(多執行緒深入)執行緒
- Java多執行緒-執行緒中止Java執行緒
- Java多執行緒之記憶體模型Java執行緒記憶體模型
- Java 多執行緒共享模型之管程(上)Java執行緒模型
- 【java】【多執行緒】程式、執行緒的基本概念(1)Java執行緒
- 【Java多執行緒】輕鬆搞定Java多執行緒(二)Java執行緒
- java——多執行緒Java執行緒
- java多執行緒Java執行緒
- Java - 多執行緒Java執行緒
- java 多執行緒Java執行緒
- 深入淺出Win32多執行緒程式設計--之MFC的多執行緒Win32執行緒程式設計
- 玩轉java多執行緒 之多執行緒基礎 執行緒狀態 及執行緒停止實戰Java執行緒
- Java多執行緒之執行緒中止Java執行緒
- Java多執行緒-執行緒狀態Java執行緒
- Java多執行緒-執行緒通訊Java執行緒
- java 多執行緒守護執行緒Java執行緒
- Java多執行緒(2)執行緒鎖Java執行緒
- java多執行緒9:執行緒池Java執行緒
- 【java多執行緒】(二)執行緒停止Java執行緒
- Python 多執行緒無用?深入總結 二(深入瞭解GIL 執行緒守護 執行緒程式CPU關係)Python執行緒
- Java多執行緒001——一圖讀懂執行緒與程式Java執行緒
- Java多執行緒學習(一)Java多執行緒入門Java執行緒
- java多執行緒之消費生產模型Java執行緒模型
- 多執行緒,多程式執行緒
- Java多執行緒(一)多執行緒入門篇Java執行緒
- 深入理解多執行緒(三)—— Java的物件頭執行緒Java物件
- 深入淺出Java多執行緒(十三):阻塞佇列Java執行緒佇列
- java多執行緒:執行緒間通訊——生產者消費者模型Java執行緒模型
- 深入理解 Java 多執行緒、Lambda 表示式及執行緒安全最佳實踐Java執行緒