JAvaマルチスレッドの一般的な例

6515 ワード

詳細
一.関連知識:
 
Javaマルチスレッドプログラムの設計に関する知識:
 
(一)同一数量に対する操作
 
(二)同一オブジェクトに対する操作
 
(三)コールバック方法の使用
 
(四)スレッド同期、デッドロック問題
 
(五)スレッド通信
 
 など
2.例1:3つの切符売り場で同時に20枚の切符を販売する.
プログラム分析:1.票数は同じ静的値を使用する
 
 2.同じ票を売らないようにjavaマルチスレッド同期ロックをします.
 
設計構想:1.ホームクラスStationを作成し、Threadを継承し、runメソッドを書き換え、runメソッドの中でチケット販売操作を実行する!切符を売るにはシンクロロックが必要です.つまり、1つのホームでこの切符を売っているとき、他のホームはこの切符が売り切れているのを待っています.
 
2.マスターメソッド呼び出しクラスの作成
(一)ホームクラスを作成し、Threadを継承する
 
package com.xykj.threadStation;

public class Station extends Thread {

        //              
        public Station(String name) {
             super(name);//        
        }       
        //          ,     
        static int tick = 20;
        //         
        static Object ob = "aa";//     
        //   run  ,      
        @Override
        public void run() {
            while (tick > 0) {
                synchronized (ob) {//      ,       ,
                    //             ,           
                    if (tick > 0) {
                        System.out.println(getName() + "    " + tick + "  ");
                        tick--;
                    } else {
                        System.out.println("    ");
                    }
                }
                try {
                     sleep(1000);//    
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
             
            }
    }
}

 (二)メインメソッド呼び出しクラスの作成
 
package com.xykj.threadStation;
 
public class MainClass {
    /**
     * java         
     *   :          10  
     * */
    public static void main(String[] args) {
        //       ,          
         Station station1=new Station("  1");
         Station station2=new Station("  2");
         Station station3=new Station("  3");
     
        //               
         station1.start();
         station2.start();
         station3.start();
     
    }
}

 プログラムの実行結果:
 
  2    20  
  3    19  
  1    18  
  2    17  
  3    16  
  1    15  
  1    14  
  2    13  
  3    12  
  2    11  
  1    10  
  3    9  
  2    8  
  3    7  
  1    6  
  2    5  
  1    4  
  3    3  
  3    2  
  1    1  
    

 票数が見えるのは間違いない!
三.例二:二人ABは一つの口座Aを通じてカウンターでお金を引き出し、BはATMでお金を引き出す!
プログラム分析:お金の数を静的変数に設定します.2人が取得する同じオブジェクト値
(一)Bankクラスを作成する
 
/**   AB      (2000 )
 * A      
 * B ATM   !
 * A    100 ,B    200 ,      。
 * Created by FXY on 2018/6/29.
 */
public class Bank {

    public  static  int money = 2000;


    public void withdrawMoney(int money , String equipment,String name) {
        synchronized (this) {           //    
            if (equipment.endsWith("counter")&& Bank.money>=money) {
                Bank.money -= money;
                System.out.println(name+" " + equipment + "   " + money + "   " + Bank.money);
            }
            if(equipment.endsWith("atm")&& Bank.money>=money){
                Bank.money -= money;
                System.out.println(name+" " + equipment + "   " + money + "   " + Bank.money);
            }

        }
    }

}

 二)PersonAクラスを作成する
 
/**
 * Created by FXY on 2018/6/29.
 */
public class PersionA extends Thread{

    Bank bank;

    //            ,             
    public PersionA(Bank bank) {
        this.bank = bank;
        setName("counter");//     
    }

    @Override
    public void run(){
        while (Bank.money>=100){
            bank.withdrawMoney(100,"counter",getName());
            try {
                sleep(1000);//     1 
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }
}

 (三)PersonBクラスを作成する
 
/**
 * Created by FXY on 2018/6/29.
 */
public class PersionB extends Thread{

    Bank bank;

    //            ,             
    public PersionB(Bank bank) {
        this.bank = bank;
        setName("atm");
    }
    @Override
    public void run() {
        while(Bank.money>=200){
            bank.withdrawMoney(200,"atm",getName());
            try {
                sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }

    }
}

 (四)主なメソッドの呼び出しクラスを作成する
 
public class MainClass {
    /**
     *    AB      A      B ATM   
     * */
    public static void main(String[] args) {
        //          
        Bank bank = new Bank();
        //       ,          
        PersonA pA = new PersonA(bank);
        PersonB pB = new PersonB(bank);
        //        
        pA.start();
        pB.start();  
    }
}

 実行結果:
 
counter counter   100   1900
atm atm   200   1700
counter counter   100   1600
atm atm   200   1400
counter counter   100   1300
atm atm   200   1100
atm atm   200   900
counter counter   100   800
atm atm   200   600
counter counter   100   500
counter counter   100   400
atm atm   200   200
atm atm   200   0

 取り終わって運転を停止しているのが見えます.
 
 
今日はこの2つの例を书いて、理解さえすれば、その他のは简単です!!!
 
いくつかの例がありますが、ここから引用します.
https://blog.csdn.net/wenzhi20102321/article/details/52524545