1. 程式人生 > >java多執行緒的常見例子

java多執行緒的常見例子

一.相關知識:

Java多執行緒程式設計到的知識:

(一)對同一個數量進行操作

(二)對同一個物件進行操作

(三)回撥方法使用

(四)執行緒同步,死鎖問題

(五)執行緒通訊

 等等

二.示例一:三個售票視窗同時出售20張票;

程式分析:1.票數要使用同一個靜態值

 2.為保證不會出現賣出同一個票數,要java多執行緒同步鎖。

設計思路:1.建立一個站臺類Station,繼承Thread,重寫run方法,在run方法裡面執行售票操作!售票要使用同步鎖:即有一個站臺賣這張票時,其他站臺要等這張票賣完!

2.建立主方法呼叫類

(一)建立一個站臺類,繼承Thread

  1. package com.xykj.threadStation;  
  2. public class Station extends Thread {  
  3.         // 通過構造方法給執行緒名字賦值  
  4.         public Station(String name) {  
  5.              super(name);// 給執行緒名字賦值  
  6.         }  
  7.         // 為了保持票數的一致,票數要靜態  
  8.         static int tick = 20;  
  9.         // 建立一個靜態鑰匙  
  10.         static Object ob = "aa";//值是任意的  
  11.         // 重寫run方法,實現買票操作  
  12.         @Override  
  13.         public void run() {  
  14.             while (tick > 0) {  
  15.                 synchronized (ob) {// 這個很重要,必須使用一個鎖,  
  16.                     // 進去的人會把鑰匙拿在手上,出來後才把鑰匙拿讓出來  
  17.                     if (tick > 0) {  
  18.                         System.out.println(getName() + "賣出了第" + tick + "張票");  
  19.                         tick--;  
  20.                     } else {  
  21.                         System.out.println("票賣完了");  
  22.                     }  
  23.                 }  
  24.                 try {  
  25.                      sleep(1000);//休息一秒  
  26.                 } catch (InterruptedException e) {  
  27.                     e.printStackTrace();  
  28.                 }  
  29.             }  
  30.     }  
  31. }  

(二)建立主方法呼叫類

  1. package com.xykj.threadStation;  
  2. public class MainClass {  
  3.     /**  
  4.      * java多執行緒同步鎖的使用  
  5.      * 示例:三個售票視窗同時出售10張票  
  6.      * */  
  7.     public static void main(String[] args) {  
  8.         //例項化站臺物件,併為每一個站臺取名字  
  9.          Station station1=new Station("視窗1");  
  10.          Station station2=new Station("視窗2");  
  11.          Station station3=new Station("視窗3");  
  12.         // 讓每一個站臺物件各自開始工作  
  13.          station1.start();  
  14.          station2.start();  
  15.          station3.start();  
  16.     }  
  17. }  

程式執行結果:

 

可以看到票數是不會有錯的!

三.示例二:兩個人AB通過一個賬戶A在櫃檯取錢和B在ATM機取錢!

程式分析:錢的數量要設定成一個靜態的變數。兩個人要取的同一個物件值

(一)建立一個Bank類

  1. package com.xykj.bank;  
  2. public class Bank {  
  3.     // 假設一個賬戶有1000塊錢  
  4.     static int money = 1000;  
  5.     // 櫃檯Counter取錢的方法  
  6.     public void Counter(int money) {// 引數是每次取走的錢  
  7.         Bank.money -= money;//取錢後總數減少  
  8.         System.out.println("A取走了" + money + "還剩下" + (Bank.money));  
  9.     }  
  10.     // ATM取錢的方法  
  11.     public void ATM(int money) {// 引數是每次取走的錢  
  12.         Bank.money -= money;//取錢後總數減少  
  13.         System.out.println("B取走了" + money + "還剩下" + (Bank.money));  
  14.     }  
  15. }  

(二)建立一個PersonA類

  1. package com.xykj.bank;  
  2. public class PersonA extends Thread {  
  3.     // 建立銀行物件  
  4.     Bank bank;  
  5.     // 通過構造器傳入銀行物件,確保兩個人進入的是一個銀行  
  6.     public PersonA(Bank bank) {  
  7.          this.bank = bank;  
  8.     }  
  9.     //重寫run方法,在裡面實現使用櫃檯取錢  
  10.     @Override  
  11.         public void run() {  
  12.             while (Bank.money >= 100) {  
  13.                 bank.Counter(100);// 每次取100塊  
  14.             try {  
  15.                 sleep(100);// 取完休息0.1秒  
  16.             } catch (InterruptedException e) {  
  17.                 e.printStackTrace();  
  18.             }  
  19.         }  
  20.     }  
  21. }  

(三)建立一個PersonB類

  1. package com.xykj.bank;  
  2. public class PersonB extends Thread {  
  3.     // 建立銀行物件  
  4.     Bank bank;  
  5.     // 通過構造器傳入銀行物件,確保兩個人進入的是一個銀行  
  6.     public PersonB(Bank bank) {  
  7.         this.bank = bank;  
  8.     }  
  9.     // 重寫run方法,在裡面實現使用櫃檯取錢  
  10.     @Override  
  11.     public void run() {  
  12.         while (Bank.money >= 200) {  
  13.             bank.ATM(200);// 每次取200塊  
  14.             try {  
  15.                 sleep(100);// 取完休息0.1秒  
  16.             } catch (InterruptedException e) {  
  17.                 e.printStackTrace();  
  18.             }  
  19.         }  
  20.     }  
  21. }  

(四)建立主方法的呼叫類

  1. package com.xykj.bank;  
  2. public class MainClass {  
  3.     /**  
  4.      * 兩個人AB通過一個賬戶A在櫃檯取錢和B在ATM機取錢  
  5.      * */  
  6.     public static void main(String[] args) {  
  7.         // 實力化一個銀行物件  
  8.         Bank bank = new Bank();  
  9.         // 例項化兩個人,傳入同一個銀行的物件  
  10.         PersonA pA = new PersonA(bank);  
  11.         PersonB pB = new PersonB(bank);  
  12.         // 兩個人開始取錢  
  13.         pA.start();  
  14.         pB.start();  
  15.     }  
  16. }  

執行結果:


可以看到取完就停止運行了。

四.示例三:龜兔賽跑問題

龜兔賽跑:20米     //只要為了看到效果,所有距離縮短了

要求:

1.兔子每秒0.5米的速度,每跑2米休息10秒,

2.烏龜每秒跑0.1米,休息 

 3.其中一個跑到終點後另一個不跑了!

程式設計思路:

1.建立一個Animal動物類,繼承Thread,編寫一個running抽象方法,重寫run方法,把running方法在run方法裡面呼叫。

2.建立Rabbit兔子類和Tortoise烏龜類,繼承動物類

3.兩個子類重寫running方法

4.本題的第3個要求涉及到執行緒回撥。需要在動物類建立一個回撥介面,建立一個回撥物件

(一)建立Animal動物類

  1. package com.xykj.rabbit_tortoise;  
  2. public abstract class Animal extends Thread{  
  3.     public double length=20;//比賽的長度  
  4.     public abstract void runing();//抽象方法需要子類實現  
  5.     //在父類重寫run方法,在子類只要重寫running方法就可以了  
  6.     @Override  
  7.     public void run() {  
  8.         super.run();  
  9.         while (length>0) {  
  10.              runing();  
  11.         }  
  12.     }  
  13.     //在需要回調資料的地方(兩個子類需要),宣告一個介面  
  14.     public static interface Calltoback{  
  15.         public void win();  
  16.     }  
  17.     //2.建立介面物件  
  18.     public Calltoback calltoback;  
  19. }  

(二)建立Rabbit兔子類

  1. 相關推薦

    java執行操作例子-(以銀行存錢取錢為例)

         以前一直沒有養成一個梳理知識的習慣,今天覆習到多執行緒的知識的,想到的經典的存錢取錢多執行緒同步機制,今天在這裡梳理下,錯的地方請各位大佬指正1:多執行緒同步的方法1:使用synchronized關鍵字修飾方法和程式碼塊(這就是兩種了)2:使用特殊變數volatit

    JAVA執行常見問題總結

    看這片文章之前,請問讀者有沒有對高併發以及concurrent工具包(jdk1.5推出)有一個初略的認識,以及有沒有編碼實戰經驗? 1、多執行緒有什麼用? 一個可能在很多人看來很扯淡的一個問題:我會用多執行緒就好了,還管它有什麼用?在我看來,這個回答更扯淡。所謂"知其然

    Java執行常見面試題目

    1.多執行緒瞭解麼?什麼是執行緒安全?2.Java多執行緒的理解3.手寫java多執行緒4.對高負載有了解麼,對高併發有了解麼?5.執行緒池的使用時的注意事項6.講一下執行緒狀態轉移圖7.Java新建執行緒有哪幾種方式8.執行緒池的作用9.一千萬使用者併發搶購,怎麼設計10.

    java執行常見例子

    一.相關知識:Java多執行緒程式設計到的知識:(一)對同一個數量進行操作(二)對同一個物件進行操作(三)回撥方法使用(四)執行緒同步,死鎖問題(五)執行緒通訊 等等二.示例一:三個售票視窗同時出售20張票;程式分析:1.票數要使用同一個靜態值 2.為保證不會出現賣出同一個票

    Java執行開發——一個簡單的數字加減小例子

    範例: 兩個執行緒實現加法,兩個執行緒實現減法 class Resource { private int num = 0; private boolean flag = true; //flag = true 表示可以進行加法操作,不能進行減法操作 //flag = fa

    java執行學習(十一) 常見的單例模式執行安全性分析

    類初始化鎖  怎麼理解? 為什麼需要了解? 常見的單例模式分析 懶漢式 為什麼執行緒不安全 驗證 餓漢式 為什麼執行緒安全 雙重檢查鎖定方式 演變由來 為什麼執行緒不安全 如何解決執行緒不安全 靜態類方式 為什麼執行緒安全 結

    Java執行----執行的同步,鎖和死鎖,問題以及解決方法(例子說明)

    一、執行緒併發同步概念 執行緒同步其核心就在於一個“同”。所謂“同”就是協同、協助、配合,“同步”就是協同步調昨,也就是按照預定的先後順序進行執行,即“你先,我等, 你做完,我再做”。 執行緒同步,就是當執行緒發出一個功能呼叫時,在沒有得到結果之前,該呼叫就不會返回,其他

    java 執行 同步 觀察者 併發集合的一個例子

    //第一版 package com.hra.riskprice; import com.hra.riskprice.SysEnum.Factor_Type; import org.springframework.boot.SpringApplication; import org.springfram

    java執行同步的例子

    多執行緒訪問共享的資源物件,為了避免錯誤,java提供三種解決機制同步程式碼塊 synchronized code block同步方法 synchronized method同步鎖 ReentrantLockpackage com.linchengshen._01.threa

    java socket伺服器客戶端執行例子

    package com.xueyoucto.xueyou; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; im

    Java執行面試常見核心問題總結

    [27/Jun/2006:10:03:08] WARNING (26140): CORE3283: stderr:"Thread-20" daemon prio=5 tid=0x01394f18 nid=0x109 runnable [6716f000..6716fc28][27/Jun/2006:10:03

    Java執行-生產者消費者例子-使用阻塞佇列(BlockingQueue)實現

    import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; /** * Created by wisgood . */ public

    java執行簡單小例子2——實現Runnable介面

    /** * 實現Runnable介面的類 * * @author */ public class DoSomething implements Runnable { private St

    java執行之死鎖的例子

    在java多執行緒編寫程式中特別害怕的一種情況就是死鎖,他會讓程式死在哪裡不在繼續執行下面就來看一個死鎖的例子: /** * 死鎖的例子 */ public class SiSuoTest

    Java 執行的操作常見操作(Multithread operation)

    作者:楊 版權宣告:    本文為博主原創文章,轉載請附上源文連結:https://my.oschina.net/yangmufa/blog/3113727     如果覺得本文對你有所收穫,你的請評論點贊與合理優質的轉發也將是鼓勵支援我繼續創

    Java執行實現電影院售票案例

    某電影院目前正在上映賀歲大片,共有100張票,而它有3個售票視窗,請設計一個程式模擬該電影院售票。 定義Sell類實現Runnable介面,很好的解決了單繼承共享資源問題 public class Sell implements Runnable { // 定義100張票,三個售票

    java執行物件鎖、類鎖、同步機制詳解

    1.在java多執行緒程式設計中物件鎖、類鎖、同步機制synchronized詳解:     物件鎖:在java中每個物件都有一個唯一的鎖,物件鎖用於物件例項方法或者一個物件例項上面的。     類鎖:是用於一個類靜態方法或者class物件的,一個

    Java 執行實現死鎖場景

    簡述: 《Java 程式設計思想》  P718 ~ P722 模擬死鎖的場景, 三個人 三根筷子,每個人需要拿到身邊的兩根筷子才能開始吃飯 出現死鎖的場景是,三個人都拿到了右邊的筷子,但是由於筷子都被搶佔,均無法獲得左邊的筷子 Chopstick.java

    Java 執行 join和interrupt 方法

    簡述: 使用Java多執行緒中join和interrupt函式 《Java程式設計思想》 P669 ~ P670 一個執行緒可以再其他執行緒上呼叫join()方法,其效果是等待一段時間直到第二個執行緒結束才繼續執行。 如果某個執行緒在另一個執行緒t上呼叫t.join(), 此

    Java 執行 CountDownLatch 試用

    簡述: 使用Java多執行緒的庫,包括 ExecutorService執行緒池, CountDownLatch執行緒執行控制(知道所有啟動的執行緒呼叫完成後,函式才會繼續執行) package test.anialy.multithread; import java.ut