JAvaマルチスレッドの一般的な例
6515 ワード
詳細
一.関連知識:
Javaマルチスレッドプログラムの設計に関する知識:
(一)同一数量に対する操作
(二)同一オブジェクトに対する操作
(三)コールバック方法の使用
(四)スレッド同期、デッドロック問題
(五)スレッド通信
など
2.例1:3つの切符売り場で同時に20枚の切符を販売する.
プログラム分析:1.票数は同じ静的値を使用する
2.同じ票を売らないようにjavaマルチスレッド同期ロックをします.
設計構想:1.ホームクラスStationを作成し、Threadを継承し、runメソッドを書き換え、runメソッドの中でチケット販売操作を実行する!切符を売るにはシンクロロックが必要です.つまり、1つのホームでこの切符を売っているとき、他のホームはこの切符が売り切れているのを待っています.
2.マスターメソッド呼び出しクラスの作成
(一)ホームクラスを作成し、Threadを継承する
(二)メインメソッド呼び出しクラスの作成
プログラムの実行結果:
票数が見えるのは間違いない!
三.例二:二人ABは一つの口座Aを通じてカウンターでお金を引き出し、BはATMでお金を引き出す!
プログラム分析:お金の数を静的変数に設定します.2人が取得する同じオブジェクト値
(一)Bankクラスを作成する
二)PersonAクラスを作成する
(三)PersonBクラスを作成する
(四)主なメソッドの呼び出しクラスを作成する
実行結果:
取り終わって運転を停止しているのが見えます.
今日はこの2つの例を书いて、理解さえすれば、その他のは简単です!!!
いくつかの例がありますが、ここから引用します.
https://blog.csdn.net/wenzhi20102321/article/details/52524545
一.関連知識:
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