A. java nio 開發實例
首先了解下所謂的java nio是個什麼東西!
傳統的並發型伺服器設計是利用阻塞型網路I/O 以多線程的模式來實現的 然而由
於系統常常在進行網路讀寫時處於阻塞狀態 會大大影響系統的性能 自Java 開始引入
了NIO(新I/O) API 通過使用非阻塞型I/O 實現流暢的網路讀寫操作 為開發高性能並發
型伺服器程序提供了一個很好的解決方案 這就罩笑答是java nio
首先來看下傳統的阻塞型網路 I/O的不足
Java 平台傳統的I/O 系統都是基於Byte(位元組)和Stream(數據流)的 相應的I/O 操
作都是阻塞型的 所以伺服器程序也採用阻塞型I/O 進行數據的讀 寫操作 本文以TCP
長連接模式來討論並發型伺服器的相關設計 為了實現伺服器程序的並發性要求 系統由一
個單獨的主線程來監聽用戶發起的連接請求 一直處於阻塞狀態 當有用戶連接請求到來時
程序都會啟一個新的線程來統一處理用戶數據的讀 寫操作
這種模式的優點是簡單 實用 易管理 然而缺點也是顯而易見的 由於是為每一個客
戶端分配一個線程來處理輸入 輸出數據 其線程與客戶機的比例近似為 隨著線程
數量的不斷增加 伺服器啟動了大量的並發線程 會大大加大系統對線程的管理開銷 這將
成為吞吐量瓶頸的主要原因 其次由於底層的I/O 操作採用的同步模式 I/O 操作的阻塞管
理粒度是以服務於請求的線程為單位的 有可能大量的線程會閑置 處於盲等狀態升派 造成I/O
資源利用率不高 影響整個系統的性能
對於並發型伺服器 系統用在阻塞型I/O 等待和線程間切換的時間遠遠多於CPU 在內
存中處理數據的時間 因此傳統的阻塞型物慧I/O 已經成為制約系統性能的瓶頸 Java 版本
後推出的NIO 工具包 提供了非阻塞型I/O 的非同步輸入輸出機制 為提高系統的性能提供
了可實現的基礎機制
NIO 包及工作原理
針對傳統I/O 工作模式的不足 NIO 工具包提出了基於Buffer(緩沖區) Channel(通
道) Selector(選擇器)的新模式 Selector(選擇器) 可選擇的Channel(通道)和
SelectionKey(選擇鍵)配合起來使用 可以實現並發的非阻塞型I/O 能力
NIO 工具包的成員
Buffer(緩沖器)
Buffer 類是一個抽象類 它有 個子類分別對應於七種基本的數據類型 ByteBuffer
CharBuffer DoubleBuffer FloatBuffer IntBuffer LongBuffer 和ShortBuffer 每一個Buffer
對象相當於一個數據容器 可以把它看作內存中的一個大的數組 用來存儲和提取所有基本
類型(boolean 型除外)的數據 Buffer 類的核心是一塊內存區 可以直接對其執行與內存有關
的操作 利用操作系統特性和能力提高和改善Java 傳統I/O 的性能
Channel(通道)
Channel 被認為是NIO 工具包的一大創新點 是(Buffer)緩沖器和I/O 服務之間的通道
具有雙向性 既可以讀入也可以寫出 可以更高效的傳遞數據 我們這里主要討論
ServerSocketChannel 和SocketChannel 它們都繼承了SelectableChannel 是可選擇的通道
分別可以工作在同步和非同步兩種方式下(這里的可選擇不是指可以選擇兩種工作方式 而是
指可以有選擇的注冊自己感興趣的事件) 當通道工作在同步方式時 它的功能和編程方法
與傳統的ServerSocket Socket 對象相似 當通道工作在非同步工作方式時 進行輸入輸出處
理不必等到輸入輸出完畢才返回 並且可以將其感興趣的(如 接受操作 連接操作 讀出
操作 寫入操作)事件注冊到Selector 對象上 與Selector 對象協同工作可以更有效率的支
持和管理並發的網路套接字連接
Selector(選擇器)和SelectionKey(選擇鍵)
各類 Buffer 是數據的容器對象 各類Channel 實現在各類Buffer 與各類I/O 服務間傳輸
數據 Selector 是實現並發型非阻塞I/O 的核心 各種可選擇的通道將其感興趣的事件注冊
到Selector 對象上 Selector 在一個循環中不斷輪循監視這各些注冊在其上的Socket 通道
SelectionKey 類則封裝了SelectableChannel 對象在Selector 中的注冊信息 當Selector 監測
到在某個注冊的SelectableChannel 上發生了感興趣的事件時 自動激活產生一個SelectionKey
對象 在這個對象中記錄了哪一個SelectableChannel 上發生了哪種事件 通過對被激活的
SelectionKey 的分析 外界可以知道每個SelectableChannel 發生的具體事件類型 進行相應的
處理
NIO 工作原理
通過上面的討論 我們可以看出在並發型伺服器程序中使用NIO 實際上是通過網路事
件驅動模型實現的 我們應用Select 機制 不用為每一個客戶端連接新啟線程處理 而是將
其注冊到特定的Selector 對象上 這就可以在單線程中利用Selector 對象管理大量並發的網
絡連接 更好的利用了系統資源 採用非阻塞I/O 的通信方式 不要求阻塞等待I/O 操作完
成即可返回 從而減少了管理I/O 連接導致的系統開銷 大幅度提高了系統性能
當有讀或寫等任何注冊的事件發生時 可以從Selector 中獲得相應的
SelectionKey 從SelectionKey 中可以找到發生的事件和該事件所發生的具體的
SelectableChannel 以獲得客戶端發送過來的數據 由於在非阻塞網路I/O 中採用了事件觸
發機制 處理程序可以得到系統的主動通知 從而可以實現底層網路I/O 無阻塞 流暢地讀
寫 而不像在原來的阻塞模式下處理程序需要不斷循環等待 使用NIO 可以編寫出性能更
好 更易擴展的並發型伺服器程序
並發型伺服器程序的實現代碼
應用 NIO 工具包 基於非阻塞網路I/O 設計的並發型伺服器程序與以往基於阻塞I/O 的
實現程序有很大不同 在使用非阻塞網路I/O 的情況下 程序讀取數據和寫入數據的時機不
是由程序員控制的 而是Selector 決定的 下面便給出基於非阻塞網路I/O 的並發型伺服器
程序的核心代碼片段
import java io * //引入Java io包
import * //引入包
import java nio channels * //引入Java nio channels包
import java util * //引入Java util包
public class TestServer implements Runnable
{
/**
* 伺服器Channel對象 負責接受用戶連接
*/
private ServerSocketChannel server
/**
* Selector對象 負責監控所有的連接到伺服器的網路事件的發生
*/
private Selector selector
/**
* 總的活動連接數
*/
private int activeSockets
/**
* 伺服器Channel綁定的埠號
*/
private int port
/**
*
* 構造函數
*/
public TestServer()throws IOException
{
activeSockets=
port= //初始化伺服器Channel綁定的埠號為
selector= Selector open() //初始化Selector對象
server=ServerSocketChannel open() //初始化伺服器Channel對象
ServerSocket socket=server socket() //獲取伺服器Channel對應的//ServerSocket對象
socket bind(new InetSocketAddress(port)) //把Socket綁定到監聽埠 上
nfigureBlocking(false) //將伺服器Channel設置為非阻塞模式
server register(selector SelectionKey OP_ACCEPT) //將伺服器Channel注冊到
Selector對象 並指出伺服器Channel所感興趣的事件為可接受請求操作
}
public void run()
{
while(true)
{
try
{
/**
*應用Select機制輪循是否有用戶感興趣的新的網路事件發生 當沒有
* 新的網路事件發生時 此方法會阻塞 直到有新的網路事件發生為止
*/
selector select()
}
catch(IOException e)
{
continue //當有異常發生時 繼續進行循環操作
}
/**
* 得到活動的網路連接選擇鍵的集合
*/
Set<SelectionKey> keys=selector selectedKeys()
activeSockets=keys size() //獲取活動連接的數目
if(activeSockets== )
{
continue //如果連接數為 則繼續進行循環操作
}
/**
/**
* 應用For—Each循環遍歷整個選擇鍵集合
*/
for(SelectionKey key :keys)
{
/**
* 如果關鍵字狀態是為可接受 則接受連接 注冊通道 以接受更多的*
事件 進行相關的伺服器程序處理
*/
if(key isAcceptable())
{
doServerSocketEvent(key)
continue
}
/**
* 如果關鍵字狀態為可讀 則說明Channel是一個客戶端的連接通道
* 進行相應的讀取客戶端數據的操作
*/
if(key isReadable())
{
doClientReadEvent(key)
continue
}
/**
* 如果關鍵字狀態為可寫 則也說明Channel是一個客戶端的連接通道
* 進行相應的向客戶端寫數據的操作
*/
if(key isWritable())
{
doClinetWriteEvent(key)
continue
}
}
}
}
/**
* 處理伺服器事件操作
* @param key 伺服器選擇鍵對象
*/
private void doServerSocketEvent(SelectionKey key)
{
SocketChannel client=null
try
{
ServerSocketChannel server=(ServerSocketChannel)key channel()
client=server accept()
if(client==null)
{
return
}
nfigureBlocking(false) //將客戶端Channel設置為非阻塞型
/**
/**
* 將客戶端Channel注冊到Selector對象上 並且指出客戶端Channel所感
* 興趣的事件為可讀和可寫
*/
client register(selector SelectionKey OP_READ|SelectionKey OP_READ)
}catch(IOException e)
{
try
{
client close()
}catch(IOException e ){}
}
}
/**
* 進行向客戶端寫數據操作
* @param key 客戶端選擇鍵對象
*/
private void doClinetWriteEvent(SelectionKey key)
{
代碼實現略
}
/**
* 進行讀取客戶短數據操作
* @param key 客戶端選擇鍵對象
*/
private void doClientReadEvent(SelectionKey key)
{
代碼實現略
}
}
從上面對代碼可以看出 使用非阻塞性I/O進行並發型伺服器程序設計分三個部分
向Selector對象注冊感興趣的事件 從Selector中獲取所感興趣的事件 根據不同的事件進
行相應的處理
結語
通過使用NIO 工具包進行並發型伺服器程序設計 一個或者很少幾個Socket 線程就可
以處理成千上萬個活動的Socket 連接 大大降低了伺服器端程序的開銷 同時網路I/O 採取
非阻塞模式 線程不再在讀或寫時阻塞 操作系統可以更流暢的讀寫數據並可以更有效地向
CPU 傳遞數據進行處理 以便更有效地提高系統的性能
看到這里相信你看了不止 分鍾了吧 我說 分鍾其實就是想讓大家能夠輕松的讀下去(雞蛋 )
好了 到這里大家應該對java nio有個初步的了解了吧~~~
lishixin/Article/program/Java/hx/201311/27190
B. 在實際Java開發中,真會有一個Service需要多個實現類的需要嗎
是的,在實際Java開發中,可能會存在一個Service需要多個實現類的情況。
這種情況通常發生在項目需求變更或擴展時。例如,在一個電商網站中,購物車功能是一個核心模塊,但隨著業務的擴展,可能需要對購物車的功能進行擴展或優化,例如添加折扣、積分等功能。此時,可以通過擴展原來的購物車實現類,或者編寫新的購物車實現類來實現不同的功能需求。
另外,使用多個實現類還可以用於實現不同的業務場景。例如,在一個電商網站中,不同的商品類別可能具有不同的銷售策略,例如滿減、折扣等,此時可以使用不同的實現類來實現不同的銷售策略。
因此,在實際Java開發中,禪轎使用多個實現類可以提高代碼的靈活性和可擴展性,橘殲使得系統更加易圓襲沖於維護和擴展。
C. 在java實際開發中,人們一般用linux來做什麼事
linux上一般是布置運行的環境,配置java的服務,比如睜螞tomcat,linux系統消耗資源少,效率高,安全,或早稿centos系統完全免費,也許你開發是在windows上,但是運行衫孝現在linux是主流,當然也要是什麼服務,並不能以偏概全,windows也有他不可替代的有點。
環境布置好了,就可以把開發的軟體放到linux下運行,linux運維人員要復雜,軟體的升級,維護,排錯,優化......總之就是為了其更好地運行。
D. Java語言在實際開發工作中能用到些什麼技術呢
Java語言有J2SE\J2EE\J2ME,分別是用於桌面開發,Web開發,移動開發,這三個看意思是做什麼的也能夠大概猜個八九不離十了。不同的開發,需要用到的技術是段仔悄不同的。另外,你這個技術講的也比較含糊。整個Java是語言,但語言也是技術啊,所以用Java開發自然用到的就是Java技術了。
當然,撇開語言來說,那就是一般的程序開發都會用到的一握渣些語言以外的技術了。比如,你做游戲開發,那就要用到線程,用到資料庫技術,做網站或者說B/S設計,那就設計到網路了,那就要用到Tomcat伺服器搭建,存放數據表單就要用到戚塌資料庫了,用到Servlet和jsp,設計模式就用到Structs+ Spring + Hibernate,用到EJB了。而移動開發,自然要了解你設計的移動設備的硬體方面的知識了。
額,實際上,你需要知道的是,Java的功能是非常強大的,甚至可以數,除了最底層的東西,很少有人專門用Java來做,其它的都可以用java,而所有的軟體都是語言編的,你等於是問,程序設計在開發中能用到哪些技術!!
E. java實際開發中常用的技術有哪些
RMI: java自身提供的用在分布時對象之間的通信機制。(類似於RPC)
RMI-IIOP: RMI的可移植擴展,可以實現JAVA與CORBA的集成。
JDBC: 用於資料庫訪問的通用介面。
JTA,JTS: 用於提供事務處理的支持。
JMS: java消息服務。可以連接已有的面向消息的中間件,例如:MQSeries,MSMQ。
Java Servlet: 用來擴展Web伺服器功能的網路組件。基於請求/響應機制。
JSP: Java與HTML混合編程,類似於ASP。
JavaIDL: Java對COBRA的實現,允許與其他預言集成。且能讓分布式對象利用CORBA提供的全面服務。所以J2EE與CORBA完全兼容。
Java Mail: 平台無關,協議無關地發送郵件。
J2EE連接器架構: 自動管理現有系統和中間件之間的諸多細節。
JAXP: Java操作XML。
JAAS: Java的用戶認證支持。
EJB: J2EE中最重要的部分,實現組件式開發的基礎。可以在多層的分布式環境中部署的伺服器端軟體組件。
JNI: (Java Native Interface)
聲明Native代碼,用C/C++實現它。可以實現:
1、 使用標准JAVA不支持的功能,例如訪問Win32API。
2、 重用其他語言編寫的庫或應用程序。例如大量的C庫。
3、 需要用低級語言編程時,例如匯編。
Oracle所實現的C底層代碼與Java的無縫集成,就是JNI技術的很好例證。Oracle不單使用Java界面,還支持Java編寫的存儲過程。
JNDI: 用於訪問命令和目錄系統。
JNDI為底層命名或目錄服務提供統一的API。可支持任何伺服器名稱,標准服務有:LDAP,NDS,CORBA,LDAP活動目錄等。
J2EE終,可用JNDI發布下列組件:EJB,數據源(資料庫),JMS消息隊列。
F. java開發在實際工作中需要用到哪些技術
這些足夠了。
java開發工作的初級程序員,需要掌握的技能我整理一下:
java語言基礎
常用框架瞎余(SSH)不需要了解底層,只需要了解如何使用
JS語法基礎(js的Ajax)
Jquery使用基礎(Jquery的Ajax)
基本的html語法至少要能看懂
CSS也要看懂一點
資料庫了解明塵oracle和mysql
會寫增刪改查語句以及關聯查詢
存儲過程,觸發器(這個不需要一定會,但是了解最好)
以上都達到可以上手的層次,就能拿下初級java程序員的崗位了。
祝你磨槐滾學習順利
G. Java中的多態到底有什麼實際開發作用
JAVA語言特徵之一多態機制,故名思議就是多種變化形態。
在實際的開發當中一般都應用在兩個方面,其一:神段方法的多態---重載(overload)和重寫(override),其二:對象的多態,對象的向上轉型,對象的向下轉型。
方法的重載:發生在同一個類當中,方法名稱相同,參數列表不同。
經常看到的就是某一個類的構造方法,例如:String類
當然也可以是其他普通方法。
方法的重寫:發生在有繼承關系的類中(說白了就是子類中),方法名稱和參數列表一模一樣。
例如: Object類當中的equals()方法、toString()方法等。
對象的多態:
向上轉型: 父類類型 父類對象名稱 = new 子類類型();
向下轉型:子類類型 子類對象名稱 = (子類類型)父類對象名稱;
注意: 先由向上轉型再有向下轉型,如果直接寫向下轉型則會出現ClassCastException(類型轉換異常)
應用:1.為介面/抽象類實例化對象
例如: List<String> list = new ArrayList<String>();
2.在方法當中的參數----如果是父類類型,則可以傳入子類對象
謹腔 例如: public void show(Object obj) {}
6.當然,在高級框架中也是存在多游晌譽態的內容,但是只要知道怎麼用即可。
H. JAVA在現實生活中到底有哪些應用
Java----作為世界上應用最廣泛的編程語言之一,在現實生活中到底用在什麼地方?什麼種類的項目使用Java開發?在哪些領域內Java是占統治地位的?
其實,從電子商務網站到安卓App,從科學應用到經濟應用,從游戲到桌面應用,從開源類庫到J2ME應用,在現實生活中很多地方都用到了Java。
1)安卓應用
如果你想弄清楚Java用在什麼地方,你離這個目標不是太遠,打開你的安卓手機和任何一款App,它們是使用Java語言、基於GoogleAndroidAPI(和JDK類似)開發的。數年來安卓支持已經有了很大提高,並且很多Java程序員已經成為了安卓App開發者。順便提一下,檔告安卓使用不同的Java虛擬機、不同的包,但是代碼仍是用Java寫的。
2)JavaWeb應用
Java在電子商務和Web應用領域也是有很多的應用。現在有很多使用SpringMVC、Structs2.0和類似框架開發的RESTful風格的服務,甚至一個簡單的依賴Servlet、JSP和Structs開發的web應用在各種各樣的政府項目中很受歡迎。政府的很多部門如衛生局、保險部門、國防部等部門都有他們使用Java開發的web應用。
3)金融業伺服器的應用
在金融服務中Java有很重要的應用,很多全球投資銀行像高盛、花旗、巴克萊、渣打銀行等其他銀行使用Java來開發前台和後台電子交易系統,提供解決方案和確認系統以及數據處理項目等等。Java大多數用在開發伺服器端的應用,幾乎不用來開發前端,前端是從隱並一個伺服器接受數據,然後處理它並把它發送給其他進程,JavaSwing對交易員來說在開發客戶端的GUI方面還是很受歡迎的。
4)交易應用
第三方應用交易應用,作為更大的金融服務業的一部分也使用Java開發。流行的交易應用像Murex也是用Java開發的,很多銀行都使用它們來連接前後端。
5)J2ME應用
雖然iOS和Android的出現幾乎抹殺了J2ME的市場,但是在低終端Nokia和使用J2ME的三星手機方面還是有很大的市場。有一段時間,安卓上可用的游戲、軟體幾乎全都是用MIDP、CLDC,他們是J2ME平台的一部分。J2ME在一些產品如藍光光碟、機頂盒等等。WhatsApp很受歡迎的一個原因是因為對所有Nokia手機的J2ME平台來說是可用的。
6)軟體工具
很多有用的軟體和開發工具是用Java開發的,例灶蠢跡如Eclipse、InetelliJ、NetbeansIDE。還有大多數使用的桌面應用也是用Java開發的。所以有一段時間,Swing在開發客戶端方面非常流行,尤其是在金融行業和投資銀行。現在,JavaFX正逐漸受到歡迎,但是仍不能成為Swing的替代品。
7)嵌入式領域
在嵌入式領域,Java也是有很大應用的,它展示了平台是多麼的強大,你僅需130Kb就能使用Java技術(在智能卡或者感測器上)。北京電腦培訓認為起初Java是為嵌入式設備而設計的。實際上,這是Java最初「一次編寫,到處運行」初衷的一個部分,現在看起來獲得了成功。
I. 用java怎麼開發聊天軟體
使用Java來開發聊天軟體可以採用客戶端/伺服器架構,其中客戶端用於用戶界面和與用戶的交互,伺服器用於處理消息傳遞和處理用戶請求。以下是一般的開發步驟:
設計聊天協議:確帆亮定聊天軟體的通信協議,包括消息格式、通信方式、用戶身份驗證等。這是聊天軟體的基礎,需要在客戶端和伺服器之間進行一致的協議設計。
客戶端界面設計:使用Java的圖形用戶界面(GUI)庫,如Swing或JavaFX,設計聊天軟體的客戶端界面。包括用戶登錄、聊天窗口、好友列表等。
客戶端功能實現:在客戶端中實現用戶登錄、消息發送和接收、好友管理等功能。使用Java的Socket API進行網路通信,通過TCP或UDP協議與伺服器進行通信。
伺服器端設計:設計伺服器端的架構,包括消息處理、用戶管理、資料庫交互等。可以使用Java的網路編程和多線程技術,以實現並發處理多個客戶端請求。
伺服器端功能實現:在伺服器端實現消息的接收、轉發和存儲,用戶管理(如注冊、登錄、好友管理)、資料庫交互等功能。使用Java的Socket API進行網路通信,與客戶端進行消息交互。
資料庫設計與實現:設計資料庫存儲用戶信息、好友關系、聊天記錄等數據,並使用Java的資料庫連接技術(如JDBC)進行資料庫操作。
聊天功能測試與優化:進行聊天功能的測試,包括用戶登錄、消息發送和接收、好友管理等。根據測試結果進行優化和調試,確保聊天軟體的穩定性和性能。
以上是一般使用Java開發聊天軟體的步驟,具體實現會涉及到更詳細的技術細節和架構設孝敬計。在開發過程中,還需注意網路安全、用戶隱私等問題,並根據實際需求進巧轎慎行功能擴展和改進。