1. 程式人生 > >java多執行緒的等待和通知機制

java多執行緒的等待和通知機制

1、通過waitnotifynotifyAll方法來配合完成

2通過執行緒鎖(ReentrantLock)、執行緒通訊狀態(Condition)

下面只介紹第一種方法。

synchronized()用來修飾一個方法或者一個程式碼塊,保證在同一時刻最多隻有一個執行緒執行該段程式碼,它獲得了物件鎖,其它執行緒對該物件所有同步程式碼部分的訪問都被暫時阻塞。

wait()notify()都是Object類的方法,而且必須在被同步的方法或者程式碼塊中呼叫。每一個Java物件都是直接或間接繼承Object類,所以任何Java物件都支援這種機制。等待和通知機制並不指定該條件到底是什麼。事實上,一般情況下也不需要指定。程式設計師決定一個執行緒在執行到程式碼的某處時在

某個物件呼叫wait()方法進行等待,另一個執行緒執行一段程式碼後認為條件滿足了,則在同一個物件上呼叫notify()方法,通知等待該物件的執行緒。

當使用wait(),notify(),notifyAll()方法時,很容易出現java.lang.IllegalMonitorStateException異常。原因就是當前執行緒沒有獲得物件的鎖,或者說當前呼叫的物件不是鎖物件。常見的毛病就是使用了執行緒物件來呼叫這些方法。所以必須明白呼叫wait(),notify(),notifyAll()的物件必須是當前鎖物件。新建一個物件鎖如下:

Object sync = newObject();


相關推薦

java 執行等待、喚醒機制例項

例子: 1、實體類 public class Student {     String name;     int age;     boolean flag = false; // 表示沒有值 } 2、執行緒1 public class SetThread impleme

java 執行等待與喚醒機制

java 併發程式設計網站 :http://ifeve.com/java-7-concurrency-cookbook/ 一: 1:JVM執行緒狀態 NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED

Java 執行 joininterrupt 方法

簡述: 使用Java多執行緒中join和interrupt函式 《Java程式設計思想》 P669 ~ P670 一個執行緒可以再其他執行緒上呼叫join()方法,其效果是等待一段時間直到第二個執行緒結束才繼續執行。 如果某個執行緒在另一個執行緒t上呼叫t.join(), 此

Java執行16:中斷機制

概述        之前講解Thread類中方法的時候,interrupt()、interrupted()、isInterrupted()三個方法沒有講得很清楚,只是提了一下。現在把這三個方法同一放到這裡來講,因為這三個方法都涉及到多執行緒的一個知識點--

Java執行同步非同步詳解

1. 多執行緒併發時,多個執行緒同時請求同一資源,必然導致此資源的資料不安全。 2. 執行緒池 在WEB服務中,對於web伺服器的響應速度必須儘可能的快,這就容不得在使用者提交請求按鈕後,再建立執行緒提供服務。為了減少使用者的等待時間,執行緒必須預先建立,放線上程池中,執行

Java 執行 生產者消費者 佇列

    wait()和notifyAll()方法以一種非常低階的方式解決了任務互操作問題,即每次互動時都握手。在許多情況下,你可以瞄向更高的抽象級別,使用同步佇列來解決任務協作問題,同步佇列在任何時刻都只允許一個任務插入或移除元素。在java.util.concurrent

java 執行 等待返回

方法1: import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;

關乎Java執行+RunnableThread…

兩種方法     一種是繼承自Thread類.Thread 類是一個具體的類,即不是抽象類,該類封裝了執行緒的行為.要建立一個執行緒,程式設計師必須建立一 個從 Thread 類匯出的新類.程式設計師通過覆蓋 Thread 的 run() 函式來完成有用的工作.使用者並不直接呼叫此函式;而是通過調

java---執行sleep()setPriority()方法

package ThreadIO2_1.Thread.schedule.v1; public class MyRunner extends Thread { private static Obje

Java執行等待所有執行結束(CountDownLatch/CyclicBarrier)

本文主要是參考官方文件做一學習用途。 官方連結: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/CountDownLatch.html http://docs.oracle.com/javase/1.5.0/docs/a

java執行FutureCallable類的解釋與使用

一,描述     ​在多執行緒下程式設計的時候,大家可能會遇到一種需求,就是我想在我開啟的執行緒都結束時,同時獲取每個執行緒中返回的資料然後再做統一處理,在這樣的需求下,Future與Callable的組合就派上了很大的用場。也有人會說,我可以使用同步來完成這個需求啊,一

java執行等待強制喚醒——interrupt

/* 停止執行緒: 1,stop方法。 2,run方法結束。 怎麼控制執行緒的任務結束呢? 任務中都會有迴圈結構,只要控制住迴圈就可以結束任務。 控制迴圈通常就用定義標記來完成。 但是如果執行緒處於了凍結狀態,無法讀取標記。如何結束呢? 可以使用interrupt(

Java執行-生產者消費者

標籤(空格分隔): java thread 簡介: 隨著作業系統的不斷更新迭代,多執行緒程式設計已經變的十分常見,java虛擬機器的多執行緒一般也是建立在作業系統本地native執行緒之上的,從而不必自己管理執行緒間的切換,直接交由本機作業系統進行排程和

java執行run()start()的區別

其實,run()和start()區別很簡單。 當你啟動執行緒,使用start(),系統會把run()方法當成執行緒執行體來處理,這是正常的,也是正確的情況。但是,當你啟動執行緒時,呼叫run()方法,系統run()方法會立即執行,但是這時候系統會把run()方法當成普通的方

Java執行17:中斷機制

概述 之前講解Thread類中方法的時候,interrupt()、interrupted()、isInterrupted()三個方法沒有講得很清楚,只是提了一下。現在把這三個方法同一放到這裡來講,因為這三個方法都涉及到多執行緒的一個知識點----中斷機制。 Java沒

java執行等待通知機制

1、通過wait和notify,notifyAll方法來配合完成 2、通過執行緒鎖(ReentrantLock)、執行緒通訊狀態(Condition) 下面只介紹第一種方法。 synchronized()用來修飾一個方法或者一個程式碼塊,保證在同一時刻最多隻有一個執行緒執行該段程式碼,它獲得了物件鎖,其它

Java執行之三volatile與等待通知機制示例

原子性,可見性與有序性 在多執行緒中,執行緒同步的時候一般需要考慮原子性,可見性與有序性 原子性 原子性定義:一個操作或者多個操作在執行過程中要麼全部執行完成,要麼全部都不執行,不存在執行一部分的情況。 以我們在Java程式碼中經常用到的自增操作i++為例,i++實際上並不是一步操作,而是首先對i的值加一,然

JAVA執行-執行間通訊(一)-等待/通知機制(wait/notify)

執行緒間通訊     執行緒與執行緒之間不是獨立的個體,它們彼此之間可以相互通訊與協作。     執行緒間通訊後,系統之間的互動性會更強大,在大大提交CPU利用率的同時,還會使程式要對各執行緒任務在處

Java執行生產者消費者說明等待喚醒機制問題虛假喚醒問題

不用等待喚醒機制實現的生產者與消費者 程式碼 package com.hust.juc; /* * 生產者和消費者案例 */ public class TestProductorAndConsumer { public static vo

java中的互斥鎖,訊號量執行等待機制

互斥鎖和訊號量都是作業系統中為併發程式設計設計基本概念,互斥鎖和訊號量的概念上的不同在於,對於同一個資源,互斥鎖只有0和1 的概念,而訊號量不止於此。也就是說,訊號量可以使資源同時被多個執行緒訪問,而互斥鎖同時只能被一個執行緒訪問 互斥鎖在java中的實現就是 Reetr