中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java實現線程有什么方式

發布時間:2020-07-01 10:00:08 來源:億速云 閱讀:130 作者:清晨 欄目:開發技術

不懂java實現線程有什么方式?其實想解決這個問題也不難,下面讓小編帶著大家一起學習怎么去解決,希望大家閱讀完這篇文章后大所收獲。

實現線程的兩種方式

上一節我們了解了關于線程的一些基本知識,下面我們正式進入多線程的實現環節。實現線程常用的有兩種方式,一種是繼承Thread類,一種是實現Runnable接口。當然還有第三種方式,那就是通過線程池來生成線程,后面我們還會學習,一步一個腳印打好基礎。

Runnable接口:

public interface Runnable {
 public abstract void run();
}

Thread類:

public class Thread implements Runnable {
 public synchronized void start() {  
  if (threadStatus != 0)
   throw new IllegalThreadStateException();  
  group.add(this);
  boolean started = false;
  try {
   start0();
   started = true;
  } finally {
   try {
    if (!started) {
     group.threadStartFailed(this);
    }
   } catch (Throwable ignore) {
    /* do nothing. If start0 threw a Throwable then
     it will be passed up the call stack */
   }
 }
 @Override
 public void run() {
  if (target != null) {
   target.run();
  }
 }
}

上面為Thread類和Runnable類的源碼,我們可以看到Thread類也是實現了Runnable接口,即Thread是Runnable的實現,那么他們到底在實現多線程上有什么區別呢?
Thread和Runnable解析:

(1)Runnable接口:

Runnable接口是java中線程的定義類。所有線程都是通過該接口來實現,該接口中的run()方法為實現方法,即線程所要實現的內容寫入該方法里面,當線程啟動時會調用該方法。
在大多數情況下,如果只想重寫run()方法而不重寫其他方法,應使用Runnable接口。

public class ThreadDemo3 {   
 public static void main(String[] args) { 
  //new了兩個線程對象——s1和s2
  //其中兩個對象各對應一個內存區域。線程運行過程中運行都是自己內存塊中的數據  
  Shop1 s1 = new Shop1("小武");
  s1.start();

  Shop1 s2 = new Shop1("小潘");
  s2.start();   
  /*
  //實例化了兩個線程對象,所以分配了兩塊內存空間
  //執行過程中操作的是自己的內存空間
  Shop2 s3 = new Shop2("小武");
  s3.run();    
  Shop2 s4 = new Shop2("小潘");
  s4.run();   
  //實際實例化了兩個線程對象
  //所以同樣分配兩個內存空間
  Thread t1 = new Thread(new Shop2("小武"));
  t1.start();

  Thread t2 = new Thread(new Shop2("小潘"));
  t2.start();
  */   
  //創建了兩個線程對象,但是使用的是同一個對象——s6 
  Shop2 s5 = new Shop2("w");  
  Shop1 s6 = new Shop1("T");
  Thread t3 = new Thread(s6);
  t3.start();

  Thread t4 =new Thread(s6);
  t4.start();      
 }
}

/**
 * 武大郎賣燒餅(因為業務的拓展,現在可以實現多窗口的出售)
 *  要求:每天只賣10個
 *
 */
class Shop1 extends Thread{
 //private int count = 10;
 //使用靜態變量可以有效的實現資源共享(因為在內存中只有一份count)
 private static int count = 10;
 public Shop1(String name) {
  super(name);
 }
 public void run(){
  //判斷是否已經賣完
  while(count>0){
   count--;
   System.out.println(this.getName() +"賣出了一個燒餅" + ",現在剩余" + count);
  }
 }
}

/**
 * 使用接口實現上面的代碼
 *
 */
class Shop2 implements Runnable{
 //私有變量,存儲剩余燒餅的個數
 private int count = 10;
 //存儲當前人的姓名
 private String name="";

 public Shop2(String name) {
  this.name = name;
 }

 /**
  * 實現銷售的方法
  */
 public void run(){
  //判斷是否已經賣完
  while(count>0){
   count--;
   System.out.println(Thread.currentThread().getId() + "、" + this.name +"賣出了一個燒餅" + ",現在剩余" + count);
  }
 }
}

(2)Thread類:

Thread類是Runnable接口的實現,jdk給我們提供了一個不用我們去想如何實現線程的方式供我們使用。同樣你在繼承Thread類的時候也需要重寫run()方法來實現你想在線程中實現的內容。

public class Test{
  public static void main(String[] args) {
    //傳統方式——單任務方式
    /*
    SimpleClass sc1 = new SimpleClass();
    sc1.say("Mike");

    SimpleClass sc2 = new SimpleClass();
    sc2.say("Han Meimei");
    */
    //創建一個線程
    ThreadClass tc1 = new ThreadClass("Mike");
    //啟動線程
    tc1.start();
    //創建一個線程
    ThreadClass tc2 = new ThreadClass("Han Meimei");
    tc2.start();

   } 
  }
 }

 class SimpleClass{
  public void say(String name){
   while(true){
    System.out.println("Hi,Im " + name);
   }
  }
 }
 class ThreadClass extends Thread{
  public ThreadClass(String name) {
   super(name);
  }

  /**
   * 將父類(Thread)的run()方法進行重寫
   * 在run()方法中包含了需要執行的代碼
   */
  public void run(){
   while(true){
    System.out.println("Hi,Im " + this.getName() + "|" + this.getId() + "|" + this.getStackTrace());
   }
  }
 }

Thread類中常用方法:

run():如果該線程時使用獨立的Runnable運行對象構造的,則調用該Runnable對象的run方法。否則,該方法不執行任何操作并返回。
sleep(longmillls):在指定的毫秒數內讓當前正在執行的線程休眠(暫停執行),此操作受到系統計時器和調度程序精度和準確性的影響 String
yield():暫停當前正在執行的線程對象,并執行其他線程 start():使該線程開始運行,java虛擬機再調用該線程的run方法
join():等待該線程結束

對比:

上面給出了Thread和Runnable的實現,我們能看到在使用Runnable的方式實現線程的過程中:

 Shop1 s6 = new Shop1("T");
 Thread t3 = new Thread(s6);
 t3.start();

即把Runnable對象(實現了Runnable接口的對象)還是塞進了Thread中讓Thread來實現。那么我們可以new 多個Thread來實現同一個Runnbale對象,即實現了資源的共享,比如在售票系統中多名用戶對同一種票的搶購。另一方面,java是單繼承多實現的,如果我們使用Thread的話意味著該類只能繼承Thread,對于程序的擴展不利,而實現Runnbale接口則沒有這個顧慮。考慮程序的健壯性,我們應該盡量使用Runnable來實現我們的線程。

run和start

初學多線程我們總是分不清楚run()方法和start()方法的區別,其實我們再看一下上面Thread類的源碼就不難發現他們的用法是很容易區分的:

  1. run()方法是線程的實現方法,即你需要線程去做什么事情,那么這些實現的內容寫在run()里面,當線程啟動時就會調用run()方法繼而實現run()內部的代碼;
  2. start()方法是線程的啟動方法,即如果你new Thread()這樣并不算完。你還得new Thread().start()才算啟動這個線程,啟動完之后線程內部會主動的調用run()方法執行該線程的業務邏輯代碼。

感謝你能夠認真閱讀完這篇文章,希望小編分享java實現線程有什么方式內容對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,遇到問題就找億速云,詳細的解決方法等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

集安市| 柳林县| 屏边| 东乡| 苗栗县| 延寿县| 施甸县| 昌黎县| 方城县| 亚东县| 伊川县| 诸暨市| 尚志市| 定兴县| 安乡县| 北流市| 稷山县| 达拉特旗| 嘉峪关市| 东乡县| 南京市| 临夏县| 阆中市| 河曲县| 建水县| 长寿区| 美姑县| 全南县| 左云县| 昌宁县| 上栗县| 台湾省| 镇远县| 南京市| 合阳县| 兴化市| 连南| 汶上县| 吕梁市| 伊宁市| 天峨县|