java非同步編程
Ⅰ 如何用java回調和線程實現非同步調用
軟體模塊之間的調用關系可以分為兩大類:即同步調用和非同步調用。在同步調用中,一段代碼(主調方)調用另一段代碼(被調方),主調方必須等待這段代碼執行完成返回結果後,才能繼續往下執行,所以,同步調用是一種阻塞式調用,主調方代碼一直阻塞等待直到被調方返回為止。同步調用相對比較直觀,也是大部分編程語言直接支持的一種調用方式。但是,同步調用在處理比較耗時的情況下會嚴重影響程序性能,影響人機交互的瞬時反應。例如,某個程序需要訪問資料庫獲取大量數據,然後根據這些數據進行一系列處理,將處理結果顯示在程序主窗口。由於資料庫訪問和大量數據的處理都是耗時的工作,在這個工作完成之前,處理結果遲遲不能顯示,用戶點擊滑鼠也不會立即得到響應,讓用戶感到整個程序顯得很沉重。面對這樣一些需要比較長時間才能完成的應用場景,我們需要採用一種非阻塞式調用方式,即非同步調用方式
Ⅱ 芯學苑 Java中同步和非同步有何異同
如果你想學習Java編程,有兩個方面建議:一是自學,二是去培訓機構1、自學:需要自己的搜集資料學習,遇到問題各位找,費時費力2、芯學苑培訓:學習系統規劃學習時間,課程安排,就業支持,在短時間內就達到了初級水平。Java課程目錄大綱:一、JavaSE基礎1.1、J2SEJAVA開發基礎知識|Eclipse開發環境|J2SE5.0API|J2SE8.0新特性|多線程技術|Socket網路技術|RegularExpression|Java反射技術|Properties技術|各種實戰設計模式|JavaDebug技術|面向對象設計原則詳解|實例解決面向對象設計|面試題內部詳解|面試答題技巧詳解|AWT/SWING技術1.2、實戰數據結構數據結構實戰訓練|數組、鏈表等常用數據結構實戰1.3、正則表達式正則表達式基本語法。預搜索、斷言、分組。JAVA操作正則表達式Matcher/Pattern1.4、反射機制JAVA的動態性、Reflection技術、JVM類載入器、Class對象、Method等。1.5、CHAT項目Chat項目通過完成一個模擬的在線聊天系統,主要鍛煉大家對於TCP/IP、Socket編程、C/S模式的編程、線程的運用等方面的能力。1.6、坦克大戰單機版/圖片版/網路版這三個項目通過大家喜聞樂見的小游戲的形式來鍛煉大家對於JavaSE綜合運用的能力,並且能夠初步運用面向對象的編程理念,鍛煉初步的設計能力,並基本掌握多線程的編程。二、JavaWeb開發2.1、資料庫技術Oracle基礎管理;SQL語言PL/SQL語言;觸發器、存儲過程;MySQL,SQLServer簡介;業界常見問題設計;資料庫表的設計範式;數據備份與移植;多表連接難題詳解;嵌入式資料庫應用;2.2、JDBC技術JDBC基礎;連接池技術;使用設計模式開發連接池;詳細擴展與測試池效率;2.3、HTML4&CSS&JavaScriptHTML語言;CSS語言;JavaScript語言;JS常用模版;後台管理模版;DOM;JS操作CSS;JS操作DOM;ECMAScript;JS操作DIV;protoype;js基於對象編程;;Firefox和firebug調試技術;2.4、Bootstrap前端css框架,讓我們的學生不會美工也能做出漂亮的頁面;2.5、JqueryJquery基本技術;Jquery使用插件;2.6、Http協議深入使用HttpWatcher深入理解協議內部機制;2.7、JSTL標簽庫JSTL核心標簽庫,JSTL函數標簽庫、JSTL格式化標簽庫,JSTL之XML解析標簽庫、自定義標簽技術;2.8、JSP&ServletServlet技術;JSP技術;JSTLTagLibrary技術;Filter&Listener技術;報表系統;FileUploading;Tomcat伺服器技術;servlet過濾器和AOP編程;servlet監聽器;2.9、SCM技術CVS初步;SVN簡介;2.10、JavaWeb實戰演練綜合運用所學知識;HTML+CSS+JS;JSP+Servlet+JavaBean;FileUploading;分頁技術;數據校驗;MVC初步;Filter;Listener;2.11、XML技術XML+XSL+DTD/Schema;XML數據解析;XML應用詳解;XQUERY技術;CAST技術(XML數據和對象互轉);2.12、AJAX技術AJAX技術基礎;AJAX技術框架;AJAX技術調試技巧;2.13、項目實戰《基於servlet/JSP技術的電子商務網站》、《基於AJax和Jquery的BBS論壇系統》、《基於ApacheCommonsFileUpload的網路硬碟系統》三、主流框架技術及項目實戰3.1、流行Web框架簡介Struts2/spring4.x/hibernate4.x/springmvc/WebWork/mybatis等簡介3.2、MVC模式ModelViewController模式深入3.3、SpringMVCspringmvc概述;springmvc的開發流程;springmvc基本配置;springmvc的註解開發;常用註解;service,control,reposity,reques+mapping,responseboby等3.4、Struts2.xStruts2的基本開發流程;action類的三種實現方法;XML配置的幾種方法;Struts2國際化支持;Struts2異常處理;Struts2的驗證框架;Struts2的多模塊配置;攔截器;3.5、Hibernate4.xHibernate基本開發流程;ORM簡介;模擬SQL語句的自動生成;hibernate的檢索;性能優化一級緩存二級緩存查詢緩存事務與並發悲觀鎖、樂觀鎖3.6、Spring4.x簡單工廠模式;抽象工廠;工廠方法模式;Spring3簡介;Spring的基本開發流程;IOC、DI;Bean的配置;SSH框架的整合;Spring的註解開發;SpringAOP開發代理模式靜態代理、動態代理、CGLIB;3.7、MybatisMybatis簡介;Mybatis的開發流程;配置文件;映射文件;面向介面的Mybatis開發;3.8、手工編寫實戰開發struts2.x框架親自動手開發struts2.x框架,融入設計模式,讓大家的對struts的核心機制爛熟於胸!3.9、手工編寫實戰開發Hibernate4.x框架芯學苑名師親自帶領你開發hibernate框架,讓你真正將ORM框架理解透徹!3.10、手工編寫實戰開發mybatis框架完成另一個ORM框架mybatis的開發工作!3.11、手工編寫實戰開發Spring4.x框架Spring是最著名的框架之一!也是業界應用范圍非常廣泛的框架!是否對其核心機制有透徹了解,往往是高薪的關鍵!因此,芯學苑名師帶領你完成spring框架核心機制的開發。當別人還在探討如何使用spring時,你已經更上層樓!3.12、項目實戰《基於struts2+spring+mybatis的電子政務系統》、《基於springMVC+hibernate的在線考試系統》
Ⅲ java同步和非同步的區別
java同步和非同步的區別如下:
一、根據情況需要專門的線程方式
如果數據將在線程間共享.例如正在寫的數據以後可能被另一個線程讀到,或者正在讀的數據可能已經被另一個線程寫過了,那麼這些數據就是共享數據,必須進行同步存取.
當應用程序在對象上調用了一個需要花費很長時間來執行的方法,並且不希望讓程序等待方法的返回時,就應該使用非同步編程,在很多情況下採用非同步途徑往往更有效率.
二、應用不同:
Java同步:
基本概念:每個Object都會有1個鎖.同步就是串列使用一些資源.
(說明:以下有些例子為了突出重點,省略了不必要的代碼.非凡是省掉了一些成員變數,就是需要同步的對象.)
1. 多線程中對共享、可變的數據進行同步.
對於函數中的局部變數沒必要進行同步.
對於不可變數據,也沒必要進行同步.
多線程中訪問共享可變數據才有必要.
2. 單個線程中可以使用synchronized,而且可以嵌套,但無意義.
class Test {
public static void main(String[] args) {
Test t = new Test();
synchronized(t) {
synchronized(t) {
System.out.println("ok!");
}
}
}
}
3. 對象實例的鎖
class Test{
public synchronized void f1(){
//do something here
}
public void f2(){
synchronized(this){
//do something here
}
}
}
上面的f1()和f2()效果一致, synchronized取得的鎖都是Test某個實列(this)的鎖.
比如: Test t = new Test();
線程A調用t.f2()時, 線程B無法進入t.f1(),直到t.f2()結束.
作用: 多線程中訪問Test的同一個實例的同步方法時會進行同步.
4. class的鎖
class Test{
final static Object o= new Object();
public static synchronized void f1(){
//do something here
}
public static void f2(){
synchronized(Test.class){
//do something here
}
}
public static void f3(){
try {
synchronized (Class.forName("Test")) {
//do something here
}
}
catch (ClassNotFoundException ex) {
}
}
public static void g(){
synchronized(o){
//do something here
}
}
}
上面f1(),f2(),f3(),g()效果一致
f1(),f2(),f3()中synchronized取得的鎖都是Test.class的鎖.
g()是自己產生一個對象o,利用o的鎖做同步
作用: 多線程中訪問此類或此類任一個實例的同步方法時都會同步. singleton模式lazily initializing屬於此類.
5. static method
class Test{
private static int v = 0;
public static void f1(){
//do something, 但函數中沒用用到v
}
public synchronized static void f2(){
//do something, 函數中對v進行了讀/寫.
}
}
多線程中使用Test的某個實列時,
(1) f1()是線程安全的,不需要同步
(2) f2()這個靜態方法中使用了函數外靜態變數,所以需要同步.
Java非同步:
1、 它要能適應不同類型的請求:
本節用 makeString來說明要求有返回值的請求.用displayString來說明不需要返回值的請求.
2、 要能同時並發處理多個請求,並能按一定機制調度:
本節將用一個隊列來存放請求,所以只能按FIFO機制調度,你可以改用LinkedList,就可以簡單實現一個優先順序(優先順序高的addFirst,低的addLast).
3、有能力將調用的邊界從線程擴展到機器間(RMI)
4、分離過度耦合,如分離調用句柄(取貨憑證)和真實數據的實現.分離調用和執行的過程,可以盡快地將調返回.
現在看具體的實現:
public interface Axman {
Result resultTest(int count,char c);
void noResultTest(String str);
}
這個介面有兩個方法要實現,就是有返回值的調用resultTest和不需要返回值的調用
noResultTest, 我們把這個介面用一個代理類來實現,目的是將方法調用轉化為對象,這樣就可以將多個請求(多個方法調)放到一個容器中緩存起來,然後統一處理,因為 Java不支持方法指針,所以把方法調用轉換為對象,然後在這個對象上統一執行它們的方法,不僅可以做到非同步處理,而且可以將代表方法調用的請求對象序列化後通過網路傳遞到另一個機器上執行(RMI).這也是Java回調機制最有力的實現.
一個簡單的例子.
如果 1: 做A
如果 2: 做B
如果 3: 做C
如果有1000個情況,你不至於用1000個case吧?以後再增加呢?
所以如果C/C++程序員,會這樣實現: (c和c++定義結構不同)
type define struct MyStruct{
int mark;
(*fn) ();
} MyList;
然後你可以聲明這個結構數據:
{1,A,
2,B
3,C
}
做一個循環:
for(i=0;i<length;i++) {
if(數據組[i].mark == 傳入的值) (數據組[i].*fn)();
}
簡單說c/c++中將要被調用的涵數可以被保存起來,然後去訪問,調用,而Java中,我們無法將一個方法保存,除了直接調用,所以將要調用的方法用子類來實現,然後把這些子類實例保存起來,然後在這些子類的實現上調用方法:
interface My{
void test();
}
Ⅳ 求一份完整的java自學學習方法
java自學網Java從入門到精通(第3版)PDF電子書.zip 免費下載
鏈接: https://pan..com/s/1vmPxcmXR7adtUZXwx64sFA
Java是一門面向對象的編程語言,不僅吸收了C++語言的各種優點,還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語言具有功能強大和簡單易用兩個特徵。Java語言作為靜態面向對象編程語言的代表,極好地實現了面向對象理論,允許程序員以優雅的思維方式進行復雜的編程。
Ⅳ java 非同步編程
用非同步輸入輸出流編寫Socket進程通信程序
在Merlin中加入了用於實現非同步輸入輸出機制的應用程序介麵包:java.nio(新的輸入輸出包,定義了很多基本類型緩沖(Buffer)),java.nio.channels(通道及選擇器等,用於非同步輸入輸出),java.nio.charset(字元的編碼解碼)。通道(Channel)首先在選擇器(Selector)中注冊自己感興趣的事件,當相應的事件發生時,選擇器便通過選擇鍵(SelectionKey)通知已注冊的通道。然後通道將需要處理的信息,通過緩沖(Buffer)打包,編碼/解碼,完成輸入輸出控制。
通道介紹:
這里主要介紹ServerSocketChannel和 SocketChannel.它們都是可選擇的(selectable)通道,分別可以工作在同步和非同步兩種方式下(注意,這里的可選擇不是指可以選擇兩種工作方式,而是指可以有選擇的注冊自己感興趣的事件)。可以用channel.configureBlocking(Boolean )來設置其工作方式。與以前版本的API相比較,ServerSocketChannel就相當於ServerSocket(ServerSocketChannel封裝了ServerSocket),而SocketChannel就相當於Socket(SocketChannel封裝了Socket)。當通道工作在同步方式時,編程方法與以前的基本相似,這里主要介紹非同步工作方式。
所謂非同步輸入輸出機制,是指在進行輸入輸出處理時,不必等到輸入輸出處理完畢才返回。所以非同步的同義語是非阻塞(None Blocking)。在伺服器端,ServerSocketChannel通過靜態函數open()返回一個實例serverChl。然後該通道調用serverChl.socket().bind()綁定到伺服器某埠,並調用register(Selector sel, SelectionKey.OP_ACCEPT)注冊OP_ACCEPT事件到一個選擇器中(ServerSocketChannel只可以注冊OP_ACCEPT事件)。當有客戶請求連接時,選擇器就會通知該通道有客戶連接請求,就可以進行相應的輸入輸出控制了;在客戶端,clientChl實例注冊自己感興趣的事件後(可以是OP_CONNECT,OP_READ,OP_WRITE的組合),調用clientChl.connect(InetSocketAddress )連接伺服器然後進行相應處理。注意,這里的連接是非同步的,即會立即返回而繼續執行後面的代碼。
選擇器和選擇鍵介紹:
選擇器(Selector)的作用是:將通道感興趣的事件放入隊列中,而不是馬上提交給應用程序,等已注冊的通道自己來請求處理這些事件。換句話說,就是選擇器將會隨時報告已經准備好了的通道,而且是按照先進先出的順序。那麼,選擇器是通過什麼來報告的呢?選擇鍵(SelectionKey)。選擇鍵的作用就是表明哪個通道已經做好了准備,准備干什麼。你也許馬上會想到,那一定是已注冊的通道感興趣的事件。不錯,例如對於伺服器端serverChl來說,可以調用key.isAcceptable()來通知serverChl有客戶端連接請求。相應的函數還有:SelectionKey.isReadable(),SelectionKey.isWritable()。一般的,在一個循環中輪詢感興趣的事件(具體可參照下面的代碼)。如果選擇器中尚無通道已注冊事件發生,調用Selector.select()將阻塞,直到有事件發生為止。另外,可以調用selectNow()或者select(long timeout)。前者立即返回,沒有事件時返回0值;後者等待timeout時間後返回。一個選擇器最多可以同時被63個通道一起注冊使用。
應用實例:
下面是用非同步輸入輸出機制實現的客戶/伺服器實常式序――程序清單1(限於篇幅,只給出了伺服器端實現,讀者可以參照著實現客戶端代碼):
程序類圖
public class NBlockingServer {
int port = 8000;
int BUFFERSIZE = 1024;
Selector selector = null;
ServerSocketChannel serverChannel = null;
HashMap clientChannelMap = null;//用來存放每一個客戶連接對應的套接字和通道
public NBlockingServer( int port ) {
this.clientChannelMap = new HashMap();
this.port = port;
}
public void initialize() throws IOException {
//初始化,分別實例化一個選擇器,一個伺服器端可選擇通道
this.selector = Selector.open();
this.serverChannel = ServerSocketChannel.open();
this.serverChannel.configureBlocking(false);
InetAddress localhost = InetAddress.getLocalHost();
InetSocketAddress isa = new InetSocketAddress(localhost, this.port );
this.serverChannel.socket().bind(isa);//將該套接字綁定到伺服器某一可用埠
}
//結束時釋放資源
public void finalize() throws IOException {
this.serverChannel.close();
this.selector.close();
}
//將讀入位元組緩沖的信息解碼
public String decode( ByteBuffer byteBuffer ) throws
CharacterCodingException {
Charset charset = Charset.forName( "ISO-8859-1" );
CharsetDecoder decoder = charset.newDecoder();
CharBuffer charBuffer = decoder.decode( byteBuffer );
String result = charBuffer.toString();
return result;
}
//監聽埠,當通道准備好時進行相應操作
public void portListening() throws IOException, InterruptedException {
//伺服器端通道注冊OP_ACCEPT事件
SelectionKey acceptKey =this.serverChannel.register( this.selector,
SelectionKey.OP_ACCEPT );
//當有已注冊的事件發生時,select()返回值將大於0
while (acceptKey.selector().select() > 0 ) {
System.out.println("event happened");
//取得所有已經准備好的所有選擇鍵
Set readyKeys = this.selector.selectedKeys();
//使用迭代器對選擇鍵進行輪詢
Iterator i = readyKeys.iterator();
while (i
else if ( key.isReadable() ) {//如果是通道讀准備好事件
System.out.println("Readable");
//取得選擇鍵對應的通道和套接字
SelectableChannel nextReady =
(SelectableChannel) key.channel();
Socket socket = (Socket) key.attachment();
//處理該事件,處理方法已封裝在類ClientChInstance中
this.readFromChannel( socket.getChannel(),
(ClientChInstance)
this.clientChannelMap.get( socket ) );
}
else if ( key.isWritable() ) {//如果是通道寫准備好事件
System.out.println("writeable");
//取得套接字後處理,方法同上
Socket socket = (Socket) key.attachment();
SocketChannel channel = (SocketChannel)
socket.getChannel();
this.writeToChannel( channel,"This is from server!");
}
}
}
}
//對通道的寫操作
public void writeToChannel( SocketChannel channel, String message )
throws IOException {
ByteBuffer buf = ByteBuffer.wrap( message.getBytes() );
int nbytes = channel.write( buf );
}
//對通道的讀操作
public void readFromChannel( SocketChannel channel, ClientChInstance clientInstance )
throws IOException, InterruptedException {
ByteBuffer byteBuffer = ByteBuffer.allocate( BUFFERSIZE );
int nbytes = channel.read( byteBuffer );
byteBuffer.flip();
String result = this.decode( byteBuffer );
//當客戶端發出」@exit」退出命令時,關閉其通道
if ( result.indexOf( "@exit" ) >= 0 ) {
channel.close();
}
else {
clientInstance.append( result.toString() );
//讀入一行完畢,執行相應操作
if ( result.indexOf( "\n" ) >= 0 ){
System.out.println("client input"+result);
clientInstance.execute();
}
}
}
//該類封裝了怎樣對客戶端的通道進行操作,具體實現可以通過重載execute()方法
public class ClientChInstance {
SocketChannel channel;
StringBuffer buffer=new StringBuffer();
public ClientChInstance( SocketChannel channel ) {
this.channel = channel;
}
public void execute() throws IOException {
String message = "This is response after reading from channel!";
writeToChannel( this.channel, message );
buffer = new StringBuffer();
}
//當一行沒有結束時,將當前字竄置於緩沖尾
public void append( String values ) {
buffer.append( values );
}
}
//主程序
public static void main( String[] args ) {
NBlockingServer nbServer = new NBlockingServer(8000);
try {
nbServer.initialize();
} catch ( Exception e ) {
e.printStackTrace();
System.exit( -1 );
}
try {
nbServer.portListening();
}
catch ( Exception e ) {
e.printStackTrace();
}
}
}
程序清單1
小結:
從以上程序段可以看出,伺服器端沒有引入多餘線程就完成了多客戶的客戶/伺服器模式。該程序中使用了回調模式(CALLBACK)。需要注意的是,請不要將原來的輸入輸出包與新加入的輸入輸出包混用,因為出於一些原因的考慮,這兩個包並不兼容。即使用通道時請使用緩沖完成輸入輸出控制。該程序在Windows2000,J2SE1.4下,用telnet測試成功。
Ⅵ java 非同步調用方法
asynchronous call(非同步調用)
一個可以無需等待被調用函數的返回值就讓操作繼續進行的方法
中文名
非同步調用
外文名
asynchronous call
領域
函數
傑作
線程
。
。
快速
導航
實戰用法非同步調用使用方法
舉例
非同步調用就是你 喊 你朋友吃飯 ,你朋友說知道了 ,待會忙完去找你 ,你就去做別的了。
同步調用就是你 喊 你朋友吃飯 ,你朋友在忙 ,你就一直在那等,等你朋友忙完了 ,你們一起去。
實戰用法
操作系統發展到今天已經十分精巧,線程就是其中一個傑作。操作系統把 CPU 處理時間劃分成許多短暫時間片,在時間 T1 執行一個線程的指令,到時間 T2又執行下一線程的指令,各線程輪流執行,結果好象是所有線程在並肩前進。這樣,編程時可以創建多個線程,在同一期間執行,各線程可以「並行」完成不同的任務。
在單線程方式下,計算機是一台嚴格意義上的馮·諾依曼式機器,一段代碼調用另一段代碼時,只能採用同步調用,必須等待這段代碼執行完返回結果後,調用方才能繼續往下執行。有了多線程的支持,可以採用非同步調用,調用方和被調方可以屬於兩個不同的線程,調用方啟動被調方線程後,不等對方返回結果就繼續執行後續代碼。被調方執行完畢後,通過某種手段通知調用方:結果已經出來,請酌情處理。
Ⅶ java的同步非同步機制
基本概念:
每個Object都會有1個鎖.
同步就是串列使用一些資源.
(說明:以下有些例子為了突出重點,省略了不必要的代碼.非凡是省掉了一些成員變數,就是需要同步的對象.)
1. 多線程中對共享、可變的數據進行同步.
對於函數中的局部變數沒必要進行同步.
對於不可變數據,也沒必要進行同步.
多線程中訪問共享可變數據才有必要.
2. 單個線程中可以使用synchronized,而且可以嵌套,但無意義.
class Test {
public static void main(String[] args) {
Test t = new Test();
synchronized(t) {
synchronized(t) {
System.out.println("ok!");
}
}
}
}
3. 對象實例的鎖
class Test{
public synchronized void f1(){
//do something here
}
public void f2(){
synchronized(this){
//do something here
}
}
}
上面的f1()和f2()效果一致, synchronized取得的鎖都是Test某個實列(this)的鎖.
比如: Test t = new Test();
線程A調用t.f2()時, 線程B無法進入t.f1(),直到t.f2()結束.
作用: 多線程中訪問Test的同一個實例的同步方法時會進行同步.
Ⅷ Java 非同步編程框架有哪些推薦
前端框架的話EXTJS跟 JQuery 都支持非同步通信,服務端的話JAVA1.7版本或更高版本的並發庫有支持非同步調用的API,若是遠程調用,也就是系統之間調用的話,web service的任何一個框架,比如CXF都支持非同步調用,因為使用的是消息傳遞機制進行通信,若你想用支持遠程過程調用(RPC)的框架的話,那就只能面向多線程編程才能實現非同步調用
Ⅸ java中同步和非同步有什麼異同
Java中交互方式分為同步和非同步兩種:
相同的地方:
都屬於交互方式,都是發送請求。
不同的地方:
同步交互:指發送一個請求,需要等待返回,然後才能夠發送下一個請求,有個等待過程;
非同步交互:指發送一個請求,不需要等待返回,隨時可以再發送下一個請求,即不需要等待。區別:一個需要等待,一個不需要等待,在部分情況下,我們的項目開發中都會優先選擇不需要等待的非同步交互方式。
(9)java非同步編程擴展閱讀:
Java,是由Sun Microsystems公司於1995年5月推出的Java程序設計語言和Java平台的總稱。用Java實現的HotJava瀏覽器(支持Java applet)顯示了Java的魅力:跨平台、動態的Web、Internet計算。從此,Java被廣泛接受並推動了Web的迅速發展,常用的瀏覽器現均支持Java applet
Java是一種簡單的,面向對象的,分布式的,解釋型的,健壯安全的,結構中立的,可移植的,性能優異、多線程的動態語言。
當1995年SUN推出Java語言之後,全世界的目光都被這個神奇的語言所吸引。那麼Java到底有何神奇之處呢?
Java語言其實最早誕生於1991年,起初被稱為OAK語言,是SUN公司為一些消費性電子產品而設計的一個通用環境。他們最初的目的只是為了開發一種獨立於平台的軟體技術,而且在網路出現之前,OAK可以說是默默無聞,甚至差點夭折。但是,網路的出現改變了OAK的命運。
參考資料:java基礎 網路
Ⅹ java非同步方法什麼意思
在JAVA平台,實現非同步調用的角色有如下三個角色:調用者,取貨憑證,真實數據
非同步調用就是:一個調用者在調用耗時操作,不能立即返回數據時,先返回一個取貨憑證.然後在過一斷時間後憑取貨憑證來獲取真正的數據.
如果數據將在線程間共享。例如正在寫的數據以後可能被另一個線程讀到,或者正在讀的數據可能已經被另一個線程寫過了,那麼這些數據就是共享數據,必須進行同步存取。當應用程序在對象上調用了一個需要花費很長時間來執行的方法,並且不希望讓程序等待方法的返回時,就應該使用非同步編程,在很多情況下採用非同步途徑往往更有效率
只有一個馬桶
很多人上廁所
要排隊
這叫同步迅雷一次可以下載很多東西
這叫非同步