java多執行緒的常見例子
一.相關知識:
Java多執行緒程式設計到的知識:
(一)對同一個數量進行操作
(二)對同一個物件進行操作
(三)回撥方法使用
(四)執行緒同步,死鎖問題
(五)執行緒通訊
等等
二.示例一:三個售票視窗同時出售20張票;
程式分析:1.票數要使用同一個靜態值
2.為保證不會出現賣出同一個票數,要java多執行緒同步鎖。
設計思路:1.建立一個站臺類Station,繼承Thread,重寫run方法,在run方法裡面執行售票操作!售票要使用同步鎖:即有一個站臺賣這張票時,其他站臺要等這張票賣完!
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();
- }
- }
程式執行結果:
可以看到票數是不會有錯的!
三.示例二:兩個人AB通過一個賬戶A在櫃檯取錢和B在ATM機取錢!
程式分析:錢的數量要設定成一個靜態的變數。兩個人要取的同一個物件值
(一)建立一個Bank類
- package com.xykj.bank;
- public class Bank {
- // 假設一個賬戶有1000塊錢
- static int money = 1000;
- // 櫃檯Counter取錢的方法
- public void Counter(int money) {// 引數是每次取走的錢
- Bank.money -= money;//取錢後總數減少
- System.out.println("A取走了" + money + "還剩下" + (Bank.money));
- }
- // ATM取錢的方法
- public void ATM(int money) {// 引數是每次取走的錢
- Bank.money -= money;//取錢後總數減少
- System.out.println("B取走了" + money + "還剩下" + (Bank.money));
- }
- }
(二)建立一個PersonA類
- package com.xykj.bank;
- public class PersonA extends Thread {
- // 建立銀行物件
- Bank bank;
- // 通過構造器傳入銀行物件,確保兩個人進入的是一個銀行
- public PersonA(Bank bank) {
- this.bank = bank;
- }
- //重寫run方法,在裡面實現使用櫃檯取錢
- @Override
- public void run() {
- while (Bank.money >= 100) {
- bank.Counter(100);// 每次取100塊
- try {
- sleep(100);// 取完休息0.1秒
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }
(三)建立一個PersonB類
- package com.xykj.bank;
- public class PersonB extends Thread {
- // 建立銀行物件
- Bank bank;
- // 通過構造器傳入銀行物件,確保兩個人進入的是一個銀行
- public PersonB(Bank bank) {
- this.bank = bank;
- }
- // 重寫run方法,在裡面實現使用櫃檯取錢
- @Override
- public void run() {
- while (Bank.money >= 200) {
- bank.ATM(200);// 每次取200塊
- try {
- sleep(100);// 取完休息0.1秒
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }
(四)建立主方法的呼叫類
- package com.xykj.bank;
- 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();
- }
- }
執行結果:
可以看到取完就停止運行了。
四.示例三:龜兔賽跑問題
龜兔賽跑: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動物類
- package com.xykj.rabbit_tortoise;
- public abstract class Animal extends Thread{
- public double length=20;//比賽的長度
- public abstract void runing();//抽象方法需要子類實現
- //在父類重寫run方法,在子類只要重寫running方法就可以了
- @Override
- public void run() {
- super.run();
- while (length>0) {
- runing();
- }
- }
- //在需要回調資料的地方(兩個子類需要),宣告一個介面
- public static interface Calltoback{
- public void win();
- }
- //2.建立介面物件
- public Calltoback calltoback;
- }
(二)建立Rabbit兔子類
-
相關推薦
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