1. 程式人生 > >Java多執行緒中所有方法的解析

Java多執行緒中所有方法的解析

一、run()和start()

  這兩個方法應該都比較熟悉,把需要並行處理的程式碼放在run()方法中,start()方法啟動執行緒將自動呼叫 run()方法,這是由Java的記憶體機制規定的。並且run()方法必須是public訪問許可權,返回值型別為void。

  二、關鍵字Synchronized

  這個關鍵字用於保護共享資料,當然前提是要分清哪些資料是共享資料。每個物件都有一個鎖標誌,當一個執行緒訪問該 物件時,被Synchronized修飾的資料將被“上鎖”,阻止其他執行緒訪問。當前執行緒訪問完這部分資料後釋放鎖標誌,其他執行緒就可以訪問了。

  public ThreadTest implements Runnable

  {

  public synchronized void run(){

  for(int i=0;i<10;i++)

  {

  System.out.println(" " + i);

  }

  }

  public static void main(String[] args)

  {

  Runnable r1 = new ThreadTest();

  Runnable r2 = new ThreadTest();

  Thread t1 = new Thread(r1);

  Thread t2 = new Thread(r2);

  t1.start();

  t2.start();

  }

  }

  以上這段程式中的 i 變數並不是共享資料,也就是這裡的ynchronized關鍵字並未起作用。因為t1,t2兩個執行緒是兩個物件(r1,r2)的執行緒。不同的物件其資料是不同的,所以r1和r2兩個物件的i變數是並不是共享資料。

  當把程式碼改成如下:Synchronized關鍵字才會起作用

  Runnable r = new ThreadTest();

  Thread t1 = new Thread(r);

  Thread t2 = new Thread(r);

  t1.start();

  t2.start();

  三、sleep()

  使當前執行緒(即呼叫該方法的執行緒)暫停執行一段時間,讓其他執行緒有機會繼續執行,但它並不釋放物件鎖。也就是如果有Synchronized同步塊,其他執行緒仍然不同訪問共享資料。注意該方法要捕獲異常比如有兩個執行緒同時執行(沒有Synchronized),一個執行緒優先順序為MAX_PRIORITY,另一個為MIN_PRIORITY,如果沒有Sleep()方法,只有高優先順序的執行緒執行完成後,低優先順序的執行緒才能執行;但當高優先順序的執行緒sleep(5000)後,低優先順序就有機會執行了。

  總之,sleep()可以使低優先順序的執行緒得到執行的機會,當然也可以讓同優先順序、高優先順序的執行緒有執行的機會。

  四、join()

  join()方法使呼叫該方法的執行緒在此之前執行完畢,也就是等待呼叫該方法的執行緒執行完畢後再往下繼續執行。注意該方法也要捕獲異常。

  五、yield()

  它與sleep()類似,只是不能由使用者指定暫停多長時間,並且yield()方法只能讓同優先順序的執行緒有執行的機會。

  六、wait()和notify()、notifyAll()

  這三個方法用於協調多個執行緒對共享資料的存取,所以必須在Synchronized語句塊內使用這三個方法。前面說過Synchronized這個關鍵字用於保護共享資料,阻止其他執行緒對共享資料的存取。但是這樣程式的流程就很不靈活了,如何才能在

  當前執行緒還沒退出Synchronized資料塊時讓其他執行緒也有機會訪問共享資料呢?此時就用這三個方法來靈活控制。

  wait()方法使當前執行緒暫停執行並釋放物件鎖標誌,讓其他執行緒可以進入Synchronized資料塊,當前執行緒被放入物件等待池中。當呼叫 notify()方法後,將從物件的等待池中移走一個任意的執行緒並放到鎖標誌等待池中,只有鎖標誌等待池中的執行緒能夠獲取鎖標誌;如果鎖標誌等待池中沒有執行緒,則notify()不起作用。

  notifyAll()則從物件等待池中移走所有等待那個物件的執行緒並放到鎖標誌等待池中。

  注意 這三個方法都是java.lang.Ojbect的方法!

相關推薦

Java執行所有方法解析

一、run()和start()   這兩個方法應該都比較熟悉,把需要並行處理的程式碼放在run()方法中,start()方法啟動執行緒將自動呼叫 run()方法,這是由Java的記憶體機制規定的。並且run()方法必須是public訪問許可權,返回值型別為void。   二

白話理解java執行join()方法

join字面意思是加入,我理解為插隊. 舉例:媽媽在炒菜,發現沒喲醬油了,讓兒子去打醬油,兒子打完醬油,媽媽炒完菜,全家一起吃 package cn.yh.thread01; /** * *

JAVA執行join()方法的詳細分析

雖然關於討論執行緒join()方法的部落格已經非常極其特別多了,但是前幾天我有一個困惑卻沒有能夠得到詳細解釋,就是當系統中正在執行多個執行緒時,join()到底是暫停了哪些執行緒,大部分部落格給的例子看起來都像是t.join()方法會使所有執行緒都暫停並等待t的執行完畢。當然

Java執行join方法的理解

[CustomThread1] Thread start.      //執行緒CustomThread1起動 [CustomThread1] Thread loop at 0   //執行緒CustomThread1執行 [CustomThread1] Thread loop at 1   //執行緒Cu

JavaJava執行join方法的理解

[CustomThread1] Thread start.      //執行緒CustomThread1起動 [CustomThread1] Thread loop at 0   //執行緒CustomThread1執行 [CustomThread1] Thread loop at 1   //執行緒Cu

Java執行join方法的實現

方法join的作用是使所屬的執行緒物件t正常執行run()方法中的任務,而使當前執行緒z進行阻塞,等待t銷燬後再繼續執行z後面的程式碼。 下面貼出join方法的原始碼: public final synchronized void join(long millis)

Java執行注入Spring的Bean-使用靜態方法直接取的容器的spring物件

目前認為比較好的解決方案。 1,工具類 public class SpringApplicationContextHolder implements ApplicationContextAware { private static ApplicationContext context

java執行關於join方法的使用

Thread的非靜態方法join()讓一個執行緒B“加入”到另外一個執行緒A的尾部。在A執行完畢之前,B不能工作。例如:         Thread t = new MyThread();         t.start();         t.join(); 另外,j

java執行對於join方法的理解

對於多執行緒的join方法一直理解得很模糊,大致看了一些資料,JDK是這樣說的:join public final void join (long millis )throws InterruptedException Waits at most millis

Java執行,Join和Interrupt()方法的使用

更多詳細的解答請轉至:http://my.oschina.net/summerpxy/blog/198457;http://uule.iteye.com/blog/1101994;(比如有一個執行緒t.當在Main執行緒中呼叫t.join()的時候,那麼Main執行緒必須拿

java執行的join方法詳解

 方法Join是幹啥用的? 簡單回答,同步,如何同步? 怎麼實現的? 下面將逐個回答。     自從接觸Java多執行緒,一直對Join理解不了。JDK是這樣說的:join public final void join(long millis)throws InterruptedException Wait

Java 執行。兩個執行交替執行,一個輸出偶數,一個輸出奇數(方法二)

package com.up366.thread.example; import java.util.concurrent.Semaphore; /** * Java 多執行緒中。兩個執行緒交替執

Java 執行。兩個執行交替執行,一個輸出偶數,一個輸出奇數(方法一)

public class DigitPrinterExample { public static void main(String[] args) { Number num =

Java執行的interrupt方法的使用

轉載出處:http://my.oschina.net/summerpxy/blog/198457  在java中,開啟一個多執行緒是很簡單的,只需要new一個runnable就可以了,但是要停止一個執行緒,卻不能簡單的使用Thread.stop()方法。

Java執行join、yield、sleep方法詳解

在Java多執行緒程式設計中,Thread類是其中一個核心和關鍵的角色。因此,對該類中一些基礎常用方法的理解和熟練使用是開發多執行緒程式碼的基礎。本篇主要總結一下Thread中常用的一些靜態方法的含義及程式碼中的使用。 sleep方法 原始碼如下: /** * Causes the curr

Java執行Synchronized簡介和Static Synchronized的區別

在進行Java開發時,多執行緒的開發是經常會使用的。首先會問一個小問題啊,在Java中有幾種方法可以建立一個執行緒? 我給的答案是3種。(如果還有其他的請留言告訴我哈。) 1、建立直接繼承自Thread類建立執行緒子類。   步驟如下:a 定義一個子類,同時

Java執行之join()方法

概要 本章,會對Thread中join()方法進行介紹。涉及到的內容包括: 1. join()介紹 2. join()原始碼分析(基於JDK1.7.0_40) 3. join()示例 來源:http://www.cnblogs.com/skywang12345/p/34792

白話理解java執行之join()方法

join字面意思是加入,我理解為插隊. 舉例:媽媽在炒菜,發現沒喲醬油了,讓兒子去打醬油,兒子打完醬油,媽媽炒完菜,全家一起吃 package cn.yh.thread01; /** * * 打醬油的例子 */ public class Demo03 { public stat

java執行的異常處理

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

java執行顯式鎖的輪詢檢測策略

顯式鎖簡介 java5.0之前,在協調對共享物件的訪問時可以使用的機制只有synchronized和volatile,java5.0增加了一種新的機制:ReentrantLock。 鎖像synchronized同步塊一樣,是一種執行緒同步機制,與synchronized不同的是ReentrantLock提