亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

實現多線程的方式有哪些

發布時間:2020-11-30 17:43:31 來源:億速云 閱讀:136 作者:Leah 欄目:編程語言

本篇文章為大家展示了實現多線程的方式有哪些,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

實現多線程的方式:

一,繼承Thread方式:

特點:多線程多實例,無法實現資源的共享。

例子:

package com.demo.study.multithreading;

public class MyThread extends Thread{

 private int i = 10;
 // 可以自行定義鎖,也可以使用實例的鎖
 Object mutex = new Object();
 public void selltickets(){
 
 synchronized (mutex) {
 
 if(i>0){
  i--;
  //getName()獲取線程的名字
  System.out.println(Thread.currentThread().getName()+" :"+ i);
 }
 }
 }
 
 @Override
 public void run() {
 while(i>0){
  
  selltickets();
 }
 }
}

啟動線程:

package com.demo.study.multithreading;

public class Test {

 public static void main(String[] args) {
//繼承Thread方式:多線程多實例,無法實現資源的共享
 MyThread myThread1 = new MyThread();
 MyThread myThread2 = new MyThread();
 //給線程命名
 myThread1.setName("線程1");
 myThread2.setName("線程2");
 myThread1.start();
 myThread2.start();
 }
}

運行結果:

實現多線程的方式有哪些

二,實現Runnable方式:

特點:多線程單實例,可實現資源的共享

例子:實現多窗口賣票:

package com.demo.study.multithreading;

public class MyThreadImpl implements Runnable {

 private int tickets = 10;

 public void sellTickets() {

 synchronized (MyThreadImpl.class) {
  if (tickets > 0) {

  tickets--;
  System.out.println(Thread.currentThread().getName() + "正在賣票,還剩下" + tickets + "張");
  }
 }
 }

 @Override
 public void run() {

 while (tickets > 0) {
  sellTickets();
  try {
  // 休眠一秒,讓執行的效果更明顯
  Thread.sleep(100);
  } catch (InterruptedException e) {
  e.printStackTrace();
  }
 }
 }
}

啟動線程:

注意:Thread中的start()方法是線程的就緒,而線程的啟動,需要等待CPU的調度(也就是所謂的線程搶資源);run()方法的方法體代表了線程需要完成的任務,稱之為線程執行體。

void start() 使該線程開始執行;Java 虛擬機調用該線程的 run 方法。

package com.demo.study.multithreading;

public class Test {

 public static void main(String[] args) {

 //只創建一個實例
 MyThreadImpl threadImpl = new MyThreadImpl();
 //將上面創建的唯一實例放入多個線程中,Thread類提供了多個構造方法,見下圖(構造方法摘要)
 Thread thread1 = new Thread(threadImpl, "窗口1");
 Thread thread2 = new Thread(threadImpl, "窗口2");
 thread1.start();
 thread2.start();
 
 }
}
構造方法摘要
Thread()
 分配新的 Thread 對象。

Thread(Runnable target)
 分配新的 Thread 對象。

Thread(Runnable target, String name)
 分配新的 Thread 對象。

Thread(String name)
 分配新的 Thread 對象。

Thread(ThreadGroup group, Runnable target)
 分配新的 Thread 對象。

Thread(ThreadGroup group, Runnable target, String name)
 分配新的 Thread 對象,以便將 target 作為其運行對象,將指定的 name 作為其名稱,并作為 group 所引用的線程組的一員。

Thread(ThreadGroup group, Runnable target, String name, long stackSize)
 分配新的 Thread 對象,以便將 target 作為其運行對象,將指定的 name 作為其名稱,作為 group 所引用的線程組的一員,并具有指定的堆棧大小

Thread(ThreadGroup group, String name)
 分配新的 Thread 對象。

運行結果:

實現多線程的方式有哪些

三、同步鎖與資源共享:

CPU可能隨機的在多個處于就緒狀態中的線程中進行切換,這時就可能出現線程的安全問題;線程安全問題,其實是指多線程環境下對共享資源的訪問可能會引起此共享資源的不一致性,而解決安全問題則需要同步鎖的加入,執行synchronized部分代碼的時候必須需要對象鎖,而一個對象只有一個鎖,只有執行完synchronized里面的代碼后釋放鎖,其他線程才可以獲得鎖,那么就保證了同一時刻只有一個線程訪問synchronized里面的代碼。實現資源共享的關鍵是,只有一個實例,synchronized使用的是同一把鎖,用實例的鎖或者定義一個實例。這就需要使用實現Runnable接口的方式,實現多線程,這樣傳入的是一個實例。繼承Thread的方式,傳入的是多個實例,每個實例都有一個鎖,那就無法實現控制。

上述內容就是實現多線程的方式有哪些,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

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

AI

双鸭山市| 彩票| 吉林省| 大竹县| 阜康市| 东兴市| 娄烦县| 乌拉特中旗| 深水埗区| 汽车| 奉贤区| 涟源市| 三穗县| 高阳县| 博爱县| 公安县| 镇雄县| 大足县| 江北区| 容城县| 黎城县| 涿鹿县| 花莲市| 成安县| 牟定县| 资阳市| 舟山市| 三河市| 弥勒县| 浦城县| 石河子市| 贺州市| 临湘市| 扬中市| 涿鹿县| 清镇市| 北辰区| 永善县| 轮台县| 西城区| 闸北区|