1. 程式人生 > >java 多執行緒等待與喚醒機制

java 多執行緒等待與喚醒機制

java 併發程式設計網站 :http://ifeve.com/java-7-concurrency-cookbook/

一:

1:JVM執行緒狀態

NEWRUNNABLEBLOCKEDWAITINGTIMED_WAITINGTERMINATED

BLOCKED是等待獲得物件鎖

WAITING是呼叫了wait, sleep, park

2:

sleep, 進入TIMED_WAITING狀態,不出讓鎖

wait, 進入TIMED_WAITING狀態,出讓鎖,並進入物件的等待佇列

park, 進入WAITING狀態,對比wait不需要獲得鎖就可以讓執行緒WAITING,通過unpark喚醒

interrupt, 只是給執行緒發個訊號,如果在wait, sleep會收到exception

yeild, 在作業系統層面讓執行緒從running變成ready狀態,等待繼續被排程。在jvm的執行緒狀態還是RUNNABLE

二:程式碼實現

package com.tc;


import java.util.concurrent.locks.LockSupport;


public class ThreadPark {


public static void main(String[] args) {
MyThread mt = new MyThread();
mt.start();
try {
Thread.currentThread().sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
mt.park();
System.out.println("canyou get here?");
try {
Thread.currentThread().sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
mt.unPark();


}

static class MyThread extends Thread {

private boolean isPark = false;


public void run() {
while (true) {
if (isPark)
LockSupport.park();
System.out.println("running....");
}
}


public void park() {
isPark = true;
}


public void unPark() {
isPark = false;
LockSupport.unpark(this);
}


}
}


相關推薦

java 執行等待喚醒機制

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

java 執行等待喚醒機制例項

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

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

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

Java執行生產者消費者等待喚醒機制(示例)

在下面新建的兩條執行緒,兩條執行緒操作的物件都是學生類,一條執行緒生產學生物件的資料,一條執行緒消費學生物件的資料,且做到,有資料才消費,沒資料就等待,沒資料就生產,有資料就等待。 第一個案例是學生類物件,非常的簡單就定義了兩個成員變數,以及一個用於喚醒執行緒的標記。 成員變數預設會賦值

Java執行--同步死鎖:synchronized;等待喚醒:wait、notify、notifyAll;生命週期

class Info{ // 定義資訊類 private String name = "李興華"; // 定義name屬性 private String content = "JAVA講師" ; // 定義content屬性 private boolean flag = false ; // 設

java 執行—— 執行等待喚醒

第1部分 wait(), notify(), notifyAll()等方法介紹   在Object.java中,定義了wait(), notify()和notifyAll()等介面。wait()的作用是讓當前執行緒進入等待狀態,同時,wait()也會讓當前執行緒釋放它所

Java執行系列05(執行等待喚醒)

1、wait(),notify(),notifyAll()等方法介紹 在Object.java中,定義了wait(), notify()和notifyAll()等介面。wait()的作用是讓當前執行緒進入等待狀態,同時,wait()也會讓當前執行緒釋放它

Java 執行基礎(六)執行等待喚醒

 Java 多執行緒基礎(六)執行緒等待與喚醒 遇到這樣一個場景,當某執行緒裡面的邏輯需要等待非同步處理結果返回後才能繼續執行。或者說想要把一個非同步的操作封裝成一個同步的過程。這裡就用到了執行緒等待喚醒機制。 一、wait()、notify()、notifyAll() 等方法介紹 在 Object

Java——設定執行等待執行喚醒

//執行緒間的通訊:執行緒的任務不同,但是執行緒操作的資料相同 /* wait(),notify(),notifyAll()必須用在同步中,因為同步中才有鎖 指明讓持有哪個鎖的執行緒去等待或被喚醒 */ //還是上次的例子,實現存一個輸出一個,而不是輸出一大堆

Java執行學習總結(Join)

join()方法的用法: join()是主執行緒 等待子執行緒的終止。也就是在子執行緒呼叫了 join() 方法後面的程式碼,只有等到子執行緒結束了才能執行。 例子如下: Java程式碼 p

Java執行學習總結(ThreadGroup)

在Java中每個執行緒都屬於某個執行緒組(ThreadGroup)。例如,如果在main()中產生一個執行緒,則這個執行緒屬於main執行緒組管理的一員,您可以使用下面的指令來獲得目前執行緒所屬的執行緒組名稱: Java程式碼

JAVA執行waitnotify詳細解析(由生產者和消費者案例引出)

生產者和消費者這個關係是個經典的多執行緒案例。現在我們編寫一個Demo來模擬生產者和消費者之間的關係。 假如有兩個類,一個是資料生產者類DataProvider,另一個是資料消費者類DataConsumer,這兩個類同時對資料類Data進行操作,生產者類負責生產資料,消費者類負責消費資料,下面是

3.執行等待喚醒

我們在之前的講解了如何自己實現臨界區以及什麼是Windows自旋鎖,這兩種同步方案線上程無法進入臨界區時都會讓當前執行緒進入等待狀態,一種是通過Sleep函式實現的,一種是通過讓當前的CPU"空轉”實現的,但這兩種等待方式都有侷限性: 通過Sleep函式進行等

Java執行synchronized lock同步及交替列印

synchronized與 lock 區別 1)Lock不是Java語言內建的,synchronized是Java語言的關鍵字。Lock是一個介面,通過這個介面的實現類可以實現同步訪問; 2)採用synchronized不需要手動釋放鎖,當synchronized方法或者sync

java執行ThreadRunnable的區別使用深入理解

首先,多執行緒的實現方式兩種:一種是繼承Thread類,另一種是實現Runnable介面。 那麼這兩種方法的區別何在?該如何選擇? 第一:他們之間的關係 檢視J2EE的API看到 Thread類中:  public class Thread extends Objec

java執行-生產者消費者模型(有限緩衝問題)

文章目錄 @[toc] 1.預備知識點 2.問題描述 3.java實現方式的預備知識 4.實現 1.預備知識點 執行緒同步 同步就是協同步調,按預定的先後次序進行執行。如:你說完,我再說。“同

Java執行16:中斷機制

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

java 執行 等待返回

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

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執行waitsynchronized方法

兩種wait()方法 第一種需要一個以毫秒計的時間作引數,它的意思和sleep()一樣,都是:“暫停一段時間”區別在於: 1.wait()會釋放物件的鎖,也就是說線上程wait()期間,別的執行緒可以呼叫它的synchronized方法。   執行緒sleep()