java非同步任務
1. java 非同步調用方法
asynchronous call(非同步調用)
一個可以無需等待被調用函數的返回值就讓操作繼續進行的方法
中文名
非同步調用
外文名
asynchronous call
領域
函數
傑作
線程
。
。
快速
導航
實戰用法非同步調用使用方法
舉例
非同步調用就是你 喊 你朋友吃飯 ,你朋友說知道了 ,待會忙完去找你 ,你就去做別的了。
同步調用就是你 喊 你朋友吃飯 ,你朋友在忙 ,你就一直在那等,等你朋友忙完了 ,你們一起去。
實戰用法
操作系統發展到今天已經十分精巧,線程就是其中一個傑作。操作系統把 CPU 處理時間劃分成許多短暫時間片,在時間 T1 執行一個線程的指令,到時間 T2又執行下一線程的指令,各線程輪流執行,結果好象是所有線程在並肩前進。這樣,編程時可以創建多個線程,在同一期間執行,各線程可以「並行」完成不同的任務。
在單線程方式下,計算機是一台嚴格意義上的馮·諾依曼式機器,一段代碼調用另一段代碼時,只能採用同步調用,必須等待這段代碼執行完返回結果後,調用方才能繼續往下執行。有了多線程的支持,可以採用非同步調用,調用方和被調方可以屬於兩個不同的線程,調用方啟動被調方線程後,不等對方返回結果就繼續執行後續代碼。被調方執行完畢後,通過某種手段通知調用方:結果已經出來,請酌情處理。
2. Java 怎麼在Main函數中,執行完非同步任務後才退出主
要實現這個情況,必須知道以下幾點 1、java中線程的結束是由run方法運行完成後自動結束的 2、在main線程(主線程)中,需要得到所有線程的引用。 3、知道jdk提供的CountDownLatch的用法 例子如下: public static void main(String[] args) throwsJava 怎麼在Main函數中,執行完非同步任務後才退出主
3. java中非同步處理和同步處理分別是什麼意思
舉個例子:A和B一起從某點出發到終點。
同步就是只能A走完某一段然後停下,讓B開始走一段再停下,再讓A走。如此往復。簡單理解就是,必須是一段程序執行完後才能執行後面的程序。
非同步就是,同一時間可能A和B同時都在往終點趕,此時不存在先後順序,就是說,兩個程序可以同時執行,稱為非同步。
4. java 同一個非同步任務內的非同步任務能不能並發
是三個線程同時運行還是依次運行,從你給的代碼看不出來,要看excute()方法里線程類用的是哪個方法,如果是用.start()方法就是同時運行,如果用run()方法則依次運行。
不過用start()方法,那三個線程就和主線程是並行運行,可能產生你的Load1Async Load2Async Load3Async 沒有運行完就去運行LoadPicAsync()了。如果LoadPicAsync()離需要用到Load1Async返回的對象,就一定要等Load1Async Load2Async Load3Async是否都運行完了,再運行LoadPicAsync()。
5. Java 怎麼在Main函數中,執行完非同步任務後才退出主線程
要實現這個情況,必須知道以下幾點
1、java中線程的結束是由run方法運行完成後自動結束的
2、在main線程(主線程)中,需要得到所有線程的引用。
3、知道jdk提供的CountDownLatch的用法
例子如下:
public static void main(String[] args) throws InterruptedException
{
//CountDownLatch作為計數器紀錄有幾個線程,例如有2個線程
CountDownLatch latch=new CountDownLatch(2);
Worker worker1=new Worker( latch);
Worker worker2=new Worker(latch);
worker1.start();// 啟動線程
worker2.start();//
//等待所有工人完成工作
latch.await();
System.out.println("all work done at "+sdf.format(new Date()));
}
class Worker extends Thread
{
private CountDownLatch latch;
public Worker(CountDownLatch latch)
{
this.latch = latch;
}
public void run()
{
xxxxx
//在run方法結束之前,講線程計數器減一
latch.countDown();
}
}
6. java中非同步處理和同步處理分別是什麼意思
同步:發送一個請求,等待返回,然後再發送下一個請求
非同步:發送一個請求,不等待返回,隨時可以再發送下一個請求
同步可以避免出現死鎖,讀臟數據的發生,一般共享某一資源的時候用,如果每個人都有修改許可權,同時修改一個文件,有可能使一個人讀取另一個人已經刪除的內容,就會出錯,同步就會按順序來修改。
非同步則是可以提高效率了,現在cpu都是雙核,四核,非同步處理的話可以同時做多項工作,當然必須保證是可以並發處理的。
這些都是對的。
同步和非同步最大的區別就在於。一個需要等待,一個不需要等待。
比如廣播,就是一個非同步例子。發起者不關心接收者的狀態。不需要等待接收者的返回信息
電話,就是一個同步例子。發起者需要等待接收者,接通電話後,通信才開始。需要等待接收者的返回信息
7. java非同步方法什麼意思
在JAVA平台,實現非同步調用的角色有如下三個角色:調用者,取貨憑證,真實數據
非同步調用就是:一個調用者在調用耗時操作,不能立即返回數據時,先返回一個取貨憑證.然後在過一斷時間後憑取貨憑證來獲取真正的數據.
如果數據將在線程間共享。例如正在寫的數據以後可能被另一個線程讀到,或者正在讀的數據可能已經被另一個線程寫過了,那麼這些數據就是共享數據,必須進行同步存取。當應用程序在對象上調用了一個需要花費很長時間來執行的方法,並且不希望讓程序等待方法的返回時,就應該使用非同步編程,在很多情況下採用非同步途徑往往更有效率
只有一個馬桶
很多人上廁所
要排隊
這叫同步迅雷一次可以下載很多東西
這叫非同步
8. java 線程池非同步任務需要處理非同步結果會阻塞嗎
1、關於非同步:java中非同步請求就是*調用*在發出之後,這個調用就直接返回了,所以沒有返回結果。換句話說,當一個非同步過程調用發出後,調用者不會立刻得到結果。而是在*調用*發出後,*被調用者*通過狀態、通知來通知調用者,或通過回調函數處理
9. java中同步和非同步有什麼異同
Java中交互方式分為同步和非同步兩種:
同步交互:指發送一個請求,需要等待返回,然後才能夠發送下一個請求,有個等待過程;
非同步交互:指發送一個請求,不需要等待返回,隨時可以再發送下一個請求,即不需要等待。
區別:一個需要等待,一個不需要等待,在部分情況下,我們的項目開發中都會優先選擇不需要等待的非同步交互方式。
哪些情況建議使用同步交互呢?比如銀行的轉賬系統,對資料庫的保存操作等等,都會使用同步交互操作,其餘情況都優先使用非同步交互。
10. java隊列實現非同步執行
在整個思路上要調整一下
1、會有很多線程給一個隊列上添加任務
2、有一個或者多個線程逐個執行隊列的任務
考慮一下幾點:
1、沒有任務時,隊列執行線程處於等待狀態
2、添加任務時,激活隊列執行線程,全部run起來,首先搶到任務的執行,其他全部wait
給個小例子吧
packageorg;
importjava.util.LinkedList;
importjava.util.List;
publicclassQueues{
publicstaticList<Task>queue=newLinkedList<Task>();
/**
*假如參數o為任務
*@paramo
*/
publicstaticvoidadd(Taskt){
synchronized(Queues.queue){
Queues.queue.add(t);//添加任務
Queues.queue.notifyAll();//激活該隊列對應的執行線程,全部Run起來
}
}
staticclassTask{
publicvoidtest(){
System.out.println("我被執行了");
}
}
}
packageorg;
importjava.util.List;
{
@Override
publicvoidrun(){
while(true){
synchronized(Queues.queue){
while(Queues.queue.isEmpty()){//
try{
Queues.queue.wait();//隊列為空時,使線程處於等待狀態
}catch(InterruptedExceptione){
e.printStackTrace();
}
System.out.println("wait...");
}
Queues.Taskt=Queues.queue.remove(0);//得到第一個
t.test();//執行該任務
System.out.println("end");
}
}
}
publicstaticvoidmain(String[]args){
Exece=newExec();
for(inti=0;i<2;i++){
newThread(e).start();//開始執行時,隊列為空,處於等待狀態
}
//上面開啟兩個線程執行隊列中的任務,那就是先到先得了
//添加一個任務測試
Queues.Taskt=newQueues.Task();
Queues.add(t);//執行該方法,激活所有對應隊列,那兩個線程就會開始執行啦
}
}
上面的就是很簡單的例子了