新聞中心
java 異步調(diào)用方法
1. 使用wait和notify方法
專業(yè)成都網(wǎng)站建設(shè)公司,做排名好的好網(wǎng)站,排在同行前面,為您帶來客戶和效益!成都創(chuàng)新互聯(lián)為您提供成都網(wǎng)站建設(shè),五站合一網(wǎng)站設(shè)計(jì)制作,服務(wù)好的網(wǎng)站設(shè)計(jì)公司,成都網(wǎng)站建設(shè)、做網(wǎng)站負(fù)責(zé)任的成都網(wǎng)站制作公司!
這個(gè)方法其實(shí)是利用了鎖機(jī)制,直接貼代碼:
public class Demo1 extends BaseDemo{ private final Object lock = new Object(); @Override public void callback(long response) { System.out.println("得到結(jié)果"); System.out.println(response); System.out.println("調(diào)用結(jié)束"); synchronized (lock) { lock.notifyAll(); } } public static void main(String[] args) { Demo1 demo1 = new Demo1(); demo1.call(); synchronized (demo1.lock){ try { demo1.lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("主線程內(nèi)容"); } }
可以看到在發(fā)起調(diào)用后,主線程利用wait進(jìn)行阻塞,等待回調(diào)中調(diào)用notify或者notifyAll方法來進(jìn)行喚醒。注意,和大家認(rèn)知的一樣,這里wait和notify都是需要先獲得對象的鎖的。在主線程中最后我們打印了一個(gè)內(nèi)容,這也是用來驗(yàn)證實(shí)驗(yàn)結(jié)果的,如果沒有wait和notify,主線程內(nèi)容會緊隨調(diào)用內(nèi)容立刻打印;而像我們上面的代碼,主線程內(nèi)容會一直等待回調(diào)函數(shù)調(diào)用結(jié)束才會進(jìn)行打印。
沒有使用同步操作的情況下,打印結(jié)果:發(fā)起調(diào)用 調(diào)用返回 主線程內(nèi)容 得到結(jié)果 1 調(diào)用結(jié)束
而使用了同步操作后:
發(fā)起調(diào)用 調(diào)用返回 得到結(jié)果 9 調(diào)用結(jié)束 主線程內(nèi)容2. 使用條件鎖
和方法一的原理類似:
public class Demo2 extends BaseDemo { private final Lock lock = new ReentrantLock(); private final Condition con = lock.newCondition(); @Override public void callback(long response) { System.out.println("得到結(jié)果"); System.out.println(response); System.out.println("調(diào)用結(jié)束"); lock.lock(); try { con.signal(); }finally { lock.unlock(); } } public static void main(String[] args) { Demo2 demo2 = new Demo2(); demo2.call(); demo2.lock.lock(); try { demo2.con.await(); } catch (InterruptedException e) { e.printStackTrace(); }finally { demo2.lock.unlock(); } System.out.println("主線程內(nèi)容"); } }
基本上和方法一沒什么區(qū)別,只是這里使用了條件鎖,兩者的鎖機(jī)制有所不同。
Java中的線程同步與異步如何理解?
線程,有時(shí)被稱為輕量級進(jìn)程(Lightweight Process,LWP),是程序執(zhí)行流的最小單元。一個(gè)標(biāo)準(zhǔn)的線程由線程ID,當(dāng)前指令指針(PC),寄存器集合和堆棧組成。
另外,線程是進(jìn)程中的一個(gè)實(shí)體,是被系統(tǒng)獨(dú)立調(diào)度和分派的基本單位,線程自己不擁有系統(tǒng)資源,只擁有一點(diǎn)兒在運(yùn)行中必不可少的資源,但它可與同屬一個(gè)進(jìn)程的其它線程共享進(jìn)程所擁有的全部資源。
一個(gè)線程可以創(chuàng)建和撤消另一個(gè)線程,同一進(jìn)程中的多個(gè)線程之間可以并發(fā)執(zhí)行。由于線程之間的相互制約,致使線程在運(yùn)行中呈現(xiàn)出間斷性。線程也有就緒、阻塞和運(yùn)行三種基本狀態(tài)。
就緒狀態(tài)是指線程具備運(yùn)行的所有條件,邏輯上可以運(yùn)行,在等待處理機(jī);運(yùn)行狀態(tài)是指線程占有處理機(jī)正在運(yùn)行;阻塞狀態(tài)是指線程在等待一個(gè)事件(如某個(gè)信號量),邏輯上不可執(zhí)行。每一個(gè)程序都至少有一個(gè)線程,若程序只有一個(gè)線程,那就是程序本身。
線程是程序中一個(gè)單一的順序控制流程。進(jìn)程內(nèi)一個(gè)相對獨(dú)立的、可調(diào)度的執(zhí)行單元,是系統(tǒng)獨(dú)立調(diào)度和分派CPU的基本單位指運(yùn)行中的程序的調(diào)度單位。在單個(gè)程序中同時(shí)運(yùn)行多個(gè)線程完成不同的工作,稱為多線程。
同步就是只能A走完某一段然后停下,讓B開始走一段再停下,再讓A走。。如此往復(fù)。簡單理解就是,必須是一段程序執(zhí)行完后才能執(zhí)行后面的程序。。
異步就是,同一時(shí)間可能A和B同時(shí)都在往終點(diǎn)趕,此時(shí)不存在先后順序,就是說,兩個(gè)程序可以同時(shí)執(zhí)行,稱為異步。
java 異步 意思
同步:提交請求-等待服務(wù)器處理-處理完畢返回 這個(gè)期間客戶端瀏覽器不能干任何事
異步: 請求通過事件觸發(fā)-服務(wù)器處理(這是瀏覽器仍然可以作其他事情)-處理完畢
同步就是你叫我去吃飯,我聽到了就和你去吃飯;如果沒有聽到,你就不停的叫,直到我告訴你聽到了,才一起去吃飯。
異步就是你叫我,然后自己去吃飯,我得到消息后可能立即走,也可能等到下班才去吃飯。
java異步方法什么意思
在JAVA平臺,實(shí)現(xiàn)異步調(diào)用的角色有如下三個(gè)角色:調(diào)用者,取貨憑證,真實(shí)數(shù)據(jù)
異步調(diào)用就是:一個(gè)調(diào)用者在調(diào)用耗時(shí)操作,不能立即返回?cái)?shù)據(jù)時(shí),先返回一個(gè)取貨憑證.然后在過一斷時(shí)間后憑取貨憑證來獲取真正的數(shù)據(jù).
如果數(shù)據(jù)將在線程間共享。例如正在寫的數(shù)據(jù)以后可能被另一個(gè)線程讀到,或者正在讀的數(shù)據(jù)可能已經(jīng)被另一個(gè)線程寫過了,那么這些數(shù)據(jù)就是共享數(shù)據(jù),必須進(jìn)行同步存取。當(dāng)應(yīng)用程序在對象上調(diào)用了一個(gè)需要花費(fèi)很長時(shí)間來執(zhí)行的方法,并且不希望讓程序等待方法的返回時(shí),就應(yīng)該使用異步編程,在很多情況下采用異步途徑往往更有效率
只有一個(gè)馬桶
很多人上廁所
要排隊(duì)
這叫同步迅雷一次可以下載很多東西
這叫異步
如何用JAVA實(shí)現(xiàn)異步信息處理
通常同步意味著一個(gè)任務(wù)的某個(gè)處理過程會對多個(gè)線程在用串行化處理,而異步則意味著某個(gè)處理過程可以允許多個(gè)線程同時(shí)處理。異步通常代表著更好的性能,因?yàn)樗艽蟪潭壬弦蕾囉诰彌_,是典型的使用空間換時(shí)間的做法,例如在計(jì)算機(jī)當(dāng)中,高速緩存作為cpu和磁盤io之間的緩沖地帶協(xié)調(diào)cpu高速計(jì)算能力和磁盤的低速讀寫能力。
(1):重新啟動(dòng)一個(gè)java程序就啟動(dòng)了一個(gè)進(jìn)程
可以用操作系統(tǒng)命令行啟動(dòng) Runtime.getRuntime().exec("java -classpath . XXX");
(2):可不可以在接收消息的模塊中的addtolist函數(shù)中添加一個(gè)專門的處理函數(shù),函數(shù)執(zhí)行時(shí)先向list中添加消息,然后探測當(dāng)前有沒有處理線程,如果沒有,則啟動(dòng)線程。
(3):想省點(diǎn)工作,可以用BlockingQueue來代替list,這樣線程等待和喚醒不用寫代碼實(shí)現(xiàn)了,如果非要用list,那么就做好同步
list的小例子:
Java codeclass MessageConsumer extends Thead { ? ?private ListYourMessageType list; ? ?private boolean running = true; ? ?public MessageConsumer(ListYourMessageType list) {this.list = list;} ? ?public void run() { ? ? ? ?while (running) { ? ? ? ? ? ?YourMessageType msg = null; ? ? ? ? ? ? try { ? ? ? ? ? ? ? ?synchronized(list) { ? ? ? ? ? ? ? ? ? ?while (list.size() == 0) { ? ? ? ? ? ? ? ? ? ? ? ?list.wait(); ? ? ? ? ? ? ? ? ? ?} ? ? ? ? ? ? ? ? ? ?msg = list.remove(0); ? ? ? ? ? ? ? ? ? ?list.notiryAll(); ? ? ? ? ? ? ? ?} ? ? ? ? ? ?} catch (Exception e) { ? ? ? ? ? ? ? ?e.printStackTrace(); ? ? ? ? ? ?} ? ? ? ? ? ?if (msg == null) continue; ? ? ? ? ? ?//System.out.println(msg); //print message ? ? ? ?} ? ?}}//調(diào)用sampleclass ShareModule { ? ?ListYourMessageType list = new ArrayListYourMessageType(); ? ?...}public class Main { ? ?public static void main(String[] args) { ? ? ? ?ShareMudule sm; //so on ? ? ? ?... ? ? ? ?Thread t = new MessageConsumer(sm.list); ? ? ? ?t.start(); ? ? ? ?... ? ?}}
java中什么同步什么是異步分別用在什么地方
java同步指的是synchronized機(jī)制,而非synchronized的都是異步,弄懂同步的概念就大致明白了兩者的差別。
有關(guān)同步:
synchronized用來修飾一個(gè)方法或者一個(gè)代碼塊,它用來保證在同一時(shí)刻最多只有一個(gè)線程執(zhí)行該段代碼。
一、當(dāng)兩個(gè)并發(fā)線程訪問同一個(gè)對象object中的這個(gè)synchronized(this)同步代碼塊時(shí),一個(gè)時(shí)間內(nèi)只能有一個(gè)線程得到執(zhí)行。另一個(gè)線程必須等待當(dāng)前線程執(zhí)行完這個(gè)代碼塊以后才能執(zhí)行該代碼塊。
二、然而,當(dāng)一個(gè)線程訪問object的一個(gè)synchronized(this)同步代碼塊時(shí),另一個(gè)線程仍然可以訪問該object中的非synchronized(this)同步代碼塊。
三、尤其關(guān)鍵的是,當(dāng)一個(gè)線程訪問object的一個(gè)synchronized(this)同步代碼塊時(shí),其他線程對object中所有其它synchronized(this)同步代碼塊的訪問將被阻塞。
四、第三個(gè)例子同樣適用其它同步代碼塊。也就是說,當(dāng)一個(gè)線程訪問object的一個(gè)synchronized(this)同步代碼塊時(shí),它就獲得了這個(gè)object的對象鎖。結(jié)果,其它線程對該object對象所有同步代碼部分的訪問都被暫時(shí)阻塞。
五、以上規(guī)則對其它對象鎖同樣適用。
示例代碼:
public class Thread1 implements Runnable {
public void run() {
synchronized(this) {
for (int i = 0; i 5; i++) {
System.out.println(Thread.currentThread().getName() + " synchronized loop " + i);
}
}
}
public static void main(String[] args) {
Thread1 t1 = new Thread1();
Thread ta = new Thread(t1, "A");
Thread tb = new Thread(t1, "B");
ta.start();
tb.start();
}
}
結(jié)果:
A synchronized loop 0
A synchronized loop 1
A synchronized loop 2
A synchronized loop 3
A synchronized loop 4
B synchronized loop 0
B synchronized loop 1
B synchronized loop 2
B synchronized loop 3
B synchronized loop 4
網(wǎng)頁名稱:java代碼中異步,java實(shí)現(xiàn)異步的幾種方法
網(wǎng)站鏈接:http://www.dlmjj.cn/article/dsihgsc.html