java多線程實常式序實現與思想

来源:https://www.cnblogs.com/flamusagi/archive/2022/09/20/16712659.html
-Advertisement-
Play Games

寫程式之前要瞭解兩個概念 1.什麼是進程 2.什麼是線程 搞清楚這兩個概念之後 才能寫好一個合適而不會太抽象的程式 對進程和線程的理解見鏈接: https://blog.csdn.net/new_teacher/article/details/51469241 https://www.cnblogs ...


寫程式之前要瞭解兩個概念
1.什麼是進程
2.什麼是線程
搞清楚這兩個概念之後 才能寫好一個合適而不會太抽象的程式
對進程和線程的理解見鏈接:
https://blog.csdn.net/new_teacher/article/details/51469241
https://www.cnblogs.com/aaronthon/p/9824396.html
那麼理解了概念之後 如何寫程式?

以銀行取錢為例:
兩個人有一個相同的賬戶->這個賬戶存儲在銀行->去銀行取錢
個人理解:
銀行是進程 客戶是線程 取錢這個動作是基於客戶所擁有的賬戶來實現的
在此參考了以下代碼:
https://blog.csdn.net/u010988549/article/details/79158121
實現:

public class Bank {
    String ACname;
    double money;
    public synchronized void withdraw(double getMoney)
    {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        this.setMoney(this.getMoney()-getMoney);
        System.out.println(Thread.currentThread().getName()+" 取出"+getMoney+"元,當前餘額為: "+this.getMoney()+" 元");
    }
}
public class Person implements Runnable{
    Bank bank;

    public Person(Bank bank) {
        this.bank = bank;
    }

    @Override
    public void run() {
        this.bank.withdraw(1000);
    }
}

我的心得見註釋:

public static void main(String[] args){
      Bank bank1=new Bank("frank",10000);//作為進程 有一塊共用資源
      Person person=new Person(bank1);//通過共用資源來建立共用對象 通過共用對象來建立線程
        //線程通過對象來使用資源 從而建立run方法
      Thread t1=new Thread(person,"father");
      Thread t2=new Thread(person,"son");
      t1.start();
      t2.start();
}

同樣道理:
以視窗售票為例:
車站有共同的車票->車站有不同的視窗來售票
車站是進程 車票是共用資源 不同的視窗是線程
而視窗共有的是什麼呢 是票對吧 票在哪 在車站
代碼如下:

public class Station {
    int tickets;

    public synchronized void sell(int buyTickets)
    {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        if(this.getTickets()>0)
        {
            this.setTickets(this.getTickets()-buyTickets);
            System.out.println(Thread.currentThread().getName() + ":賣票,票號為:" + this.getTickets());
        }
    }
}
public class SaleWindows implements Runnable {
    Station station;
    int number;

    @Override
    public void run() {
        station.sell(1);
    }
}
public static void main(String[] args){
    Station station=new Station(10);
    SaleWindows window1=new SaleWindows(station,1);//不同視窗
    SaleWindows window2=new SaleWindows(station,2);
    Thread t1=new Thread(window1,String.valueOf(window1.getNumber()));
    Thread t2=new Thread(window2,String.valueOf(window2.getNumber()));
    t1.start();
    t2.start();   
}
    
以上為寫程式的一點感悟

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在模板模式(Template Pattern)中,一個抽象類公開定義了執行它的方法的方式/模板。它的子類可以按需要重寫方法實現,但調用將以抽象類中定義的方式進行。這種類型的設計模式屬於行為型模式。 ...
  • 本文的重點在於說明工作中所使用的設計模式,為了能夠更好的理解設計模式,首先簡單介紹一下業務場景。使用設計模式,可以簡化代碼、提高擴展性、可維護性和復用性。有哪些設計模式,這裡就不再介紹了,網上很多,本文只介紹所用到設計模式。 ...
  • 大部分高級編程語言雖然語法不同,編譯器不同,學習它們的小哥哥小姐姐們不同,但有一點卻是出奇地一致:編程邏輯! 有些剛入行或剛入門的童鞋可能連編程是啥意思都沒弄懂,一下子又來了個「邏輯」,那是什麼?這裡說的邏輯,廣義上指的是抽象思維能力,也就是能思考那些客觀世界不存在的東西的能力。狹義上來說,就是明確 ...
  • 概要 設計模式類型:創建型 目標問題:創建對象時,參數設置的靈活性問題。(具體看案例) 接下來我們看一個需要改進的案例。 對象創建的優化 現在有個Employee類,你能預想到在開發中可能會出現的問題嗎?不一定是業務方面的問題哦。 最初版 public class Employee { privat ...
  • 這篇博客是我在B站看韓順平老師的數據結構和演算法的約瑟夫問題後的學習筆記,記錄一下,防止忘記,也希望能幫到各位小伙伴。 問題引入:設編號為 1,2,… n 的 n 個人圍坐一圈,約定編號為 k(1<=k<=n)的人從 1 開始報數,數 到 m 的那個人出列,它的下一位又從 1 開始報數,數到 m 的那 ...
  • 左值引用用於一級指針,特別是將它們和const關鍵字三者聯合使用時,有不同於普通左值引用的性質,主要表現在初始化方面,下麵總結一下。 ...
  • 下麵這段代碼是使用MatPlotLib繪製數據隨時間變化的趨勢。 import datetime as dt import numpy as np import pandas as pd import matplotlib.pyplot as plt import matplotlib.pylab ...
  • Java面向對象 1.類和對象 1.1 類和對象的概念: 類是抽象的集合,對象是具體的實例。 類可以想象為製作蛋糕的模具,對象就是做出來的蛋糕。 類中包含屬性(欄位)和方法(操作) 1.2 類的定義: Class ClassName { 屬性1 屬性2 ··· 構造器1 構造器2(如果不寫,系統會默 ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...