1、java多線程調(diào)用同步方法時(shí)主程序或者后臺服務(wù)Service程序兩者必須有一個(gè)正在運(yùn)行著,定時(shí)任務(wù)才會執(zhí)行。
蔡甸網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)建站!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)建站2013年至今到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)建站。
2、自動執(zhí)行的任務(wù)可以設(shè)置開啟或關(guān)閉定時(shí),檢查任務(wù)的這一開關(guān)處于開啟狀態(tài)。
3、源目錄在定時(shí)的時(shí)間點(diǎn)如果沒有變化,任務(wù)執(zhí)行后不會留下日志,通過查看任務(wù)的最后執(zhí)行時(shí)間確定任務(wù)到底執(zhí)行了沒有。
4、執(zhí)行失敗和沒有執(zhí)行不是同一回事,如果是執(zhí)行失敗則要分析失敗原因。這是java多線程調(diào)用同步方法時(shí),休眠后代碼執(zhí)行不到的原因。
這個(gè)要分段來實(shí)現(xiàn), 第一步是讓線程同步,第二部是讓線程有順序。
同步:我們可以用synchronized來解決。
Java線程同步原理: java會為每個(gè)object對象分配一個(gè)monitor,當(dāng)某個(gè)對象的同步方法(synchronized methods )被多個(gè)線程調(diào)用時(shí),該對象的monitor將負(fù)責(zé)處理這些訪問的并發(fā)獨(dú)占要求。
當(dāng)一個(gè)線程調(diào)用一個(gè)對象的同步方法時(shí),JVM會檢查該對象的monitor。如果monitor沒有被占用,那么這個(gè)線程就得到了monitor的占有權(quán),可以繼續(xù)執(zhí)行該對象的同步方法;如果monitor被其他線程所占用,那么該線程將被掛起,直到monitor被釋放。
當(dāng)線程退出同步方法調(diào)用時(shí),該線程會釋放monitor,這將允許其他等待的線程獲得monitor以使對同步方法的調(diào)用執(zhí)行下去。就像下面這樣:
public void test() {
synchronized (this) {
//做一些事
//這里只會有一個(gè)線程來調(diào)用該方法,因?yàn)橹挥幸粋€(gè)this對象作為資源分配給該線程
}
}
順序:我們可以用List來解決,因?yàn)樗怯行虻摹N覀冎恍枰獙⒁獔?zhí)行的線程放入到List中
上代碼:
/**
* 讓多個(gè)線程同步順序執(zhí)行的線程管理器
* @author bianrx
* @date 2012.1.18
* SynchronizedRunMultiThread
*/
public class SyncManager {
/**
* 待執(zhí)行的線程集合,注意這里必須是Runnable接口類型,下面會解釋
*/
private ListRunnable runnableList;
public SyncManager(){}
public SyncManager(ListRunnable runnableList) {
this.runnableList = runnableList;
}
public void setRunnable(ListRunnable runnableList) {
this.runnableList = runnableList;
}
public void run() {
//遍歷代執(zhí)行的線程集合
for(Runnable runnable: runnableList) {
runThread(runnable);
}
}
/**
* 按順序同步執(zhí)行多個(gè)線程
* @author bianrx
* @date 2012.1.18
* @param runnable
*/
private void runThread(Runnable runnable) {
synchronized (this) {
runnable.run();//這里需要注意的是:必須調(diào)用run方法,因?yàn)槿绻阏{(diào)用了start方法,線程只會向JVM請求資源,但是未必就執(zhí)行其中的run。
//這個(gè)方法是同步的,所以當(dāng)前只有一個(gè)線程占用了this對象。
}
}
}
Java的同步可以用synchronized關(guān)鍵字來實(shí)現(xiàn)。\x0d\x0a \x0d\x0asychronized可以同步代碼,需要綁定一個(gè)對象,如synchronized(obj){}\x0d\x0a也可以同步一個(gè)方法,是對方法進(jìn)行線程同步。如public void synchronized methodA(){}
1。同步代碼塊:
synchronized(同一個(gè)數(shù)據(jù)){} 同一個(gè)數(shù)據(jù):就是N條線程同時(shí)訪問一個(gè)數(shù)據(jù)。
2。
同步方法:
public synchronized 數(shù)據(jù)返回類型 方法名(){}
就
是使用 synchronized 來修飾某個(gè)方法,則該方法稱為同步方法。對于同步方法而言,無需顯示指定同步監(jiān)視器,同步方法的同步監(jiān)視器是
this
也就是該對象的本身(這里指的對象本身有點(diǎn)含糊,其實(shí)就是調(diào)用該同步方法的對象)通過使用同步方法,可非常方便的將某類變成線程安全的類,具有如下特征:
1,該類的對象可以被多個(gè)線程安全的訪問。
2,每個(gè)線程調(diào)用該對象的任意方法之后,都將得到正確的結(jié)果。
3,每個(gè)線程調(diào)用該對象的任意方法之后,該對象狀態(tài)依然保持合理狀態(tài)。
注:synchronized關(guān)鍵字可以修飾方法,也可以修飾代碼塊,但不能修飾構(gòu)造器,屬性等。
實(shí)現(xiàn)同步機(jī)制注意以下幾點(diǎn): 安全性高,性能低,在多線程用。性能高,安全性低,在單線程用。
1,不要對線程安全類的所有方法都進(jìn)行同步,只對那些會改變共享資源方法的進(jìn)行同步。
2,如果可變類有兩種運(yùn)行環(huán)境,當(dāng)線程環(huán)境和多線程環(huán)境則應(yīng)該為該可變類提供兩種版本:線程安全版本和線程不安全版本(沒有同步方法和同步塊)。在單線程中環(huán)境中,使用線程不安全版本以保證性能,在多線程中使用線程安全版本.
線程通訊:
為什么要使用線程通訊?
當(dāng)
使用synchronized
來修飾某個(gè)共享資源時(shí)(分同步代碼塊和同步方法兩種情況),當(dāng)某個(gè)線程獲得共享資源的鎖后就可以執(zhí)行相應(yīng)的代碼段,直到該線程運(yùn)行完該代碼段后才釋放對該
共享資源的鎖,讓其他線程有機(jī)會執(zhí)行對該共享資源的修改。當(dāng)某個(gè)線程占有某個(gè)共享資源的鎖時(shí),如果另外一個(gè)線程也想獲得這把鎖運(yùn)行就需要使用wait()
和notify()/notifyAll()方法來進(jìn)行線程通訊了。
Java.lang.object 里的三個(gè)方法wait() notify() notifyAll()
wait方法導(dǎo)致當(dāng)前線程等待,直到其他線程調(diào)用同步監(jiān)視器的notify方法或notifyAll方法來喚醒該線程。
wait(mills)方法
都是等待指定時(shí)間后自動蘇醒,調(diào)用wait方法的當(dāng)前線程會釋放該同步監(jiān)視器的鎖定,可以不用notify或notifyAll方法把它喚醒。
notify()
喚醒在同步監(jiān)視器上等待的單個(gè)線程,如果所有線程都在同步監(jiān)視器上等待,則會選擇喚醒其中一個(gè)線程,選擇是任意性的,只有當(dāng)前線程放棄對該同步監(jiān)視器的鎖定后,也就是使用wait方法后,才可以執(zhí)行被喚醒的線程。
notifyAll()方法
喚醒在同步監(jiān)視器上等待的所有的線程。只用當(dāng)前線程放棄對該同步監(jiān)視器的鎖定后,才可以執(zhí)行被喚醒的線程
當(dāng)前題目:java代碼同步執(zhí)行方法 java代碼同步執(zhí)行方法有幾種
網(wǎng)站鏈接:http://jinyejixie.com/article10/ddogddo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、移動網(wǎng)站建設(shè)、網(wǎng)站內(nèi)鏈、品牌網(wǎng)站制作、App開發(fā)、企業(yè)網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)