深入淺析Java項目中的多線程

這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)深入淺析Java項目中的多線程,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

“專業(yè)、務(wù)實、高效、創(chuàng)新、把客戶的事當(dāng)成自己的事”是我們每一個人一直以來堅持追求的企業(yè)文化。 創(chuàng)新互聯(lián)是您可以信賴的網(wǎng)站建設(shè)服務(wù)商、專業(yè)的互聯(lián)網(wǎng)服務(wù)提供商! 專注于網(wǎng)站設(shè)計制作、網(wǎng)站制作、軟件開發(fā)、設(shè)計服務(wù)業(yè)務(wù)。我們始終堅持以客戶需求為導(dǎo)向,結(jié)合用戶體驗與視覺傳達(dá),提供有針對性的項目解決方案,提供專業(yè)性的建議,創(chuàng)新互聯(lián)建站將不斷地超越自我,追逐市場,引領(lǐng)市場!

Java多線程實例 3種實現(xiàn)方法

Java中的多線程有三種實現(xiàn)方式:
1.繼承Thread類,重寫run方法。Thread本質(zhì)上也是一個實現(xiàn)了Runnable的實例,他代表一個線程的實例,并且啟動線程的唯一方法就是通過Thread類的start方法。
2.實現(xiàn)Runnable接口,并實現(xiàn)該接口的run()方法.創(chuàng)建一個Thread對象,用實現(xiàn)的Runnable接口的對象作為參數(shù)實例化Thread對象,調(diào)用此對象的start方法。
3.實現(xiàn)Callable接口,重寫call方法。Callable接口與Runnable接口的功能類似,但提供了比Runnable更強(qiáng)大的功能。有以下三點
1).Callable可以在人物結(jié)束后提供一個返回值,Runnable沒有提供這個功能。
2).Callable中的call方法可以拋出異常,而Runnable的run方法不能拋出異常。
3).運行Callable可以拿到一個Future對象,表示異步計算的結(jié)果,提供了檢查計算是否完成的方法。

需要注意的是,無論用那種方式實現(xiàn)了多線程,調(diào)用start方法并不意味著立即執(zhí)行多線程代碼,而是使得線程變?yōu)榭蛇\行狀態(tài)。

run start的區(qū)別

start方法是啟動一個線程,而線程中的run方法來完成實際的操作。
如果開發(fā)人員直接調(diào)用run方法,那么就會將這個方法當(dāng)作一個普通函數(shù)來調(diào)用,并沒有多開辟線程,開發(fā)人員如果希望多線程異步執(zhí)行,則需要調(diào)用start方法。

sleep wait的區(qū)別

1.兩者處理的機(jī)制不同,sleep方法主要是,讓線程暫停執(zhí)行一段時間,時間一到自動恢復(fù),并不會釋放所占用的鎖,當(dāng)調(diào)用wait方法以后,他會釋放所占用的對象鎖,等待其他線程調(diào)用notify方法才會再次醒來。
2.sleep是Threa的靜態(tài)方法,是用來控制線程自身流程的,而wait是object的方法,用于進(jìn)行線程通信。
3.兩者使用的區(qū)域不同。sleep可以在任何地方使用,wait必須放在同步控制方法,或者語句塊中執(zhí)行。

synchronized notify wait的運用

synchronized關(guān)鍵字有兩種用法,synchronized方法和synchronized語句塊。
public synchronized void function(){}
synchronized(object){}
當(dāng)某個資源被synchronized所修飾,線程1線程2等多個線程在共同請求這個資源,線程1先請求到,調(diào)用了對象的wait方法釋放了對象的鎖,此時線程2可以對這個對象進(jìn)行訪問,在工作結(jié)束時可以調(diào)用對象的notify方法,喚醒等待隊列中正在等待的線程,此時被喚醒的線程將會再一次拿到對象鎖,對對象進(jìn)行操作??梢哉{(diào)用notifyAll方法,喚醒等待隊列中的所有線程。

需要注意的是一個線程被喚醒不代表立即獲取對象鎖,必須等調(diào)用的線程對象的方法推出synchronized塊釋放對象鎖后,被喚醒的進(jìn)程才會獲得對象鎖。

以下為大家提供一個簡單的代碼實例:

分別用Runnable和Thread方法實現(xiàn),展示各個方法的

實現(xiàn)Runnable實現(xiàn)多線程的方法

public class TestRunnable implements Runnable {

 private int time=1;
 private SourceA s;
 private String id = "001";
 public TestRunnable(SourceA s){
  this.s = s;
 }
 public void setTime(int time) {
  this.time = time;
 }
 
 @Override
 public void run() {
  try {
   System.out.println("i will sleep"+ time);
   Thread.sleep(time);
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

  synchronized(s){
   s.notify();
   System.out.println("我喚醒了002!");
   System.out.println("我存入了id"+id);
   s.setSource(id);
  }
 }

}

繼承Thread實現(xiàn)多線程的方法

public class TestThread extends Thread {
 private int time = 1;
 private SourceA s = null;
 String id = "002";
 
 public void setTime(int time) {
  this.time = time;
 }
 
 public TestThread(SourceA s){
  this.s = s ;
 }
 
 @Override
 public void run() {
  try {
   System.out.println("i will sleep"+ time);
   sleep(time);
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
  synchronized(s){
   try {
    System.out.println("我"+ id +"要進(jìn)行等待了");
    s.wait();
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   System.out.println("我被喚醒了");
   System.out.println("我存入了id"+id);
   s.setSource(id);
  }
 }

}

SourceA類代碼:

public class SourceA {
 private List<String> list = new ArrayList<String>();
 public synchronized void getSource(){
  for(int i=0;i<list.size();i++){
   System.out.println(list.get(i));
  }
 }
 public synchronized void setSource(String id){
  list.add(id);
 }
}

Test測試類代碼:

public void test(){
  SourceA s = new SourceA();
  TestThread tt = new TestThread(s);
  TestRunnable tr = new TestRunnable(s);
  Thread t = new Thread(tr);
  System.out.println("調(diào)用線程1");
  tt.start();
  System.out.println("調(diào)用線程2");
  t.start();
 }

結(jié)果圖片:

深入淺析Java項目中的多線程

上述就是小編為大家分享的深入淺析Java項目中的多線程了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

名稱欄目:深入淺析Java項目中的多線程
標(biāo)題URL:http://muchs.cn/article6/ihdgog.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、移動網(wǎng)站建設(shè)、建站公司、自適應(yīng)網(wǎng)站、微信小程序、域名注冊

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)