自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

淺析Java多線程技術中所使用的方法

開發(fā) 后端
本文向您介紹了Java多線程編程中所用到的各種方法和這些方法的使用和作用,包括簡單的run()和start() 和相對復雜的wait()和notify()、notifyAll()等。

一、run()和start()

這兩個方法應該都比較熟悉,把需要并行處理的代碼放在run()方法中,start()方法啟動線程將自動調用 run()方法,這是由Java的內存機制規(guī)定的。并且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 變量并不是共享數據,也就是這里的Synchronized關鍵字并未起作用。因為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()

使當前線程(即調用該方法的線程)暫停執(zhí)行一段時間,讓其他線程有機會繼續(xù)執(zhí)行,但它并不釋放對象鎖。也就是如果有Synchronized同步塊,其他線程仍然不同訪問共享數據。注意該方法要捕獲異常

比如有兩個線程同時執(zhí)行(沒有Synchronized),一個線程優(yōu)先級為MAX_PRIORITY,另一個為MIN_PRIORITY,如果沒有Sleep()方法,只有高優(yōu)先級的線程執(zhí)行完成后,低優(yōu)先級的線程才能執(zhí)行;但當高優(yōu)先級的線程sleep(5000)后,低優(yōu)先級就有機會執(zhí)行了。

總之,sleep()可以使低優(yōu)先級的線程得到執(zhí)行的機會,當然也可以讓同優(yōu)先級、高優(yōu)先級的線程有執(zhí)行的機會。

四、join()

join()方法使調用該方法的線程在此之前執(zhí)行完畢,也就是等待調用該方法的線程執(zhí)行完畢后再往下繼續(xù)執(zhí)行。注意該方法也要捕獲異常。

五、yield()

它與sleep()類似,只是不能由用戶指定暫停多長時間,并且yield()方法只能讓同優(yōu)先級的線程有執(zhí)行的機會。

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

這三個方法用于協(xié)調多個線程對共享數據的存取,所以必須在Synchronized語句塊內使用這三個方法。前面說過Synchronized 這個關鍵字用于保護共享數據,阻止其他線程對共享數據的存取。但是這樣程序的流程就很不靈活了,如何才能在當前線程還沒退出Synchronized數據塊時讓其他線程也有機會訪問共享數據呢?此時就用這三個方法來靈活控制。

wait()方法使當前線程暫停執(zhí)行并釋放對象鎖標志,讓其他線程可以進入Synchronized數據塊,當前線程被放入對象等待池中。當調用 notify()方法后,將從對象的等待池中移走一個任意的線程并放到鎖標志等待池中,只有鎖標志等待池中的線程能夠獲取鎖標志;如果鎖標志等待池中沒有線程,則notify()不起作用。notifyAll()則從對象等待池中移走所有等待那個對象的線程并放到鎖標志等待池中。

【編輯推薦】

  1. 解析Java的多線程機制
  2. Java進階:Java多線程之ThreadLocal
  3. Java 5.0 多線程編程實踐
責任編輯:佚名 來源: 小科學家的博客
相關推薦

2009-06-29 18:08:51

Java多線程join方法

2010-02-01 17:25:09

Python多線程

2009-07-03 17:18:34

Servlet多線程

2009-06-29 18:32:52

Java多線程Synchronize

2009-08-12 18:04:44

編寫C#多線程

2021-09-11 15:26:23

Java多線程線程池

2010-03-15 18:18:33

Java多線程

2016-11-10 16:30:22

Java多線程

2010-03-03 17:44:07

Python多線程

2011-04-08 10:36:38

MFC多線程

2011-08-31 16:30:19

Lua多線程

2010-03-16 09:19:22

Java多線程

2010-03-15 18:42:52

Java多線程

2015-09-10 09:30:54

Java多線程同步

2009-08-17 14:08:33

C#進度條使用

2009-07-17 17:29:13

多任務多線程

2011-08-29 16:16:22

Lua函數多線程

2009-08-21 11:31:59

異步和多線程的區(qū)別

2009-06-29 18:00:05

Java多線程Runnable接口創(chuàng)建線程

2024-10-12 09:31:04

WinForms應用程序線程
點贊
收藏

51CTO技術棧公眾號