最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java多線程編程實(shí)例

 更新時(shí)間:2017年11月09日 09:38:26   作者:崢嶸life  
這篇文章主要介紹了java多線程編程實(shí)例,分享了幾則多線程的實(shí)例代碼,具有一定參考價(jià)值,加深多線程編程的理解還是很有幫助的,需要的朋友可以參考下。

一.相關(guān)知識(shí):

Java多線程程序設(shè)計(jì)到的知識(shí):

(一)對(duì)同一個(gè)數(shù)量進(jìn)行操作

(二)對(duì)同一個(gè)對(duì)象進(jìn)行操作

(三)回調(diào)方法使用

(四)線程同步,死鎖問題

(五)線程通信

等等

二.示例一:三個(gè)售票窗口同時(shí)出售20張票;

程序分析:

1.票數(shù)要使用同一個(gè)靜態(tài)值

2.為保證不會(huì)出現(xiàn)賣出同一個(gè)票數(shù),要java多線程同步鎖。

設(shè)計(jì)思路:

1.創(chuàng)建一個(gè)站臺(tái)類Station,繼承Thread,重寫run方法,在run方法里面執(zhí)行售票操作!售票要使用同步鎖:即有一個(gè)站臺(tái)賣這張票時(shí),其他站臺(tái)要等這張票賣完!

2.創(chuàng)建主方法調(diào)用類

(一)創(chuàng)建一個(gè)站臺(tái)類,繼承Thread

package com.xykj.threadStation;
public class Station extends Thread {
    // 通過構(gòu)造方法給線程名字賦值
    public Station(String name) {
       super(name);// 給線程名字賦值
    }
    // 為了保持票數(shù)的一致,票數(shù)要靜態(tài)
    static int tick = 20;
    // 創(chuàng)建一個(gè)靜態(tài)鑰匙
    static Object ob = "aa";//值是任意的
    // 重寫run方法,實(shí)現(xiàn)買票操作
    @Override
    public void run() {
      while (tick > 0) {
        synchronized (ob) {// 這個(gè)很重要,必須使用一個(gè)鎖,
          // 進(jìn)去的人會(huì)把鑰匙拿在手上,出來后才把鑰匙拿讓出來
          if (tick > 0) {
            System.out.println(getName() + "賣出了第" + tick + "張票");
            tick--;
          } else {
            System.out.println("票賣完了");
          }
        }
        try {
           sleep(1000);//休息一秒
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
      }
  }
}

(二)創(chuàng)建主方法調(diào)用類

package com.xykj.threadStation;
public class MainClass {
  /**
   * java多線程同步鎖的使用
   * 示例:三個(gè)售票窗口同時(shí)出售10張票
   * */
  public static void main(String[] args) {
    //實(shí)例化站臺(tái)對(duì)象,并為每一個(gè)站臺(tái)取名字
     Station station1=new Station("窗口1");
     Station station2=new Station("窗口2");
     Station station3=new Station("窗口3");
    // 讓每一個(gè)站臺(tái)對(duì)象各自開始工作
     station1.start();
     station2.start();
     station3.start();
  }
}

程序運(yùn)行結(jié)果:

窗口1賣出了第20張票
窗口2賣出了第19張票
窗口3賣出了第18張票
窗口3賣出了第17張票
窗口1賣出了第16張票
窗口2賣出了第15張票
窗口3賣出了第14張票
窗口1賣出了第13張票
窗口2賣出了第12張票
窗口2賣出了第11張票
窗口1賣出了第10張票
窗口3賣出了第9張票
窗口3賣出了第8張票
窗口1賣出了第7張票
窗口2賣出了第6張票
窗口3賣出了第5張票
窗口1賣出了第4張票
窗口2賣出了第3張票
窗口3賣出了第2張票
窗口1賣出了第1張票
票賣完了

可以看到票數(shù)是不會(huì)有錯(cuò)的!

三.示例二:兩個(gè)人AB通過一個(gè)賬戶A在柜臺(tái)取錢和B在ATM機(jī)取錢!

程序分析:錢的數(shù)量要設(shè)置成一個(gè)靜態(tài)的變量。兩個(gè)人要取的同一個(gè)對(duì)象值

(一)創(chuàng)建一個(gè)Bank類

package com.xykj.bank;
public class Bank {
  // 假設(shè)一個(gè)賬戶有1000塊錢
  static int money = 1000;
  // 柜臺(tái)Counter取錢的方法
  public void Counter(int money) {// 參數(shù)是每次取走的錢
    Bank.money -= money;//取錢后總數(shù)減少
    System.out.println("A取走了" + money + "還剩下" + (Bank.money));
  }
  // ATM取錢的方法
  public void ATM(int money) {// 參數(shù)是每次取走的錢
    Bank.money -= money;//取錢后總數(shù)減少
    System.out.println("B取走了" + money + "還剩下" + (Bank.money));
  }
}

(二)創(chuàng)建一個(gè)PersonA類

package com.xykj.bank;
public class PersonA extends Thread {
  // 創(chuàng)建銀行對(duì)象
  Bank bank;
  // 通過構(gòu)造器傳入銀行對(duì)象,確保兩個(gè)人進(jìn)入的是一個(gè)銀行
  public PersonA(Bank bank) {
     this.bank = bank;
  }
  //重寫run方法,在里面實(shí)現(xiàn)使用柜臺(tái)取錢
  @Override
    public void run() {
      while (Bank.money >= 100) {
        bank.Counter(100);// 每次取100塊
      try {
        sleep(100);// 取完休息0.1秒
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }
}

(三)創(chuàng)建一個(gè)PersonB類

package com.xykj.bank;
public class PersonB extends Thread {
  // 創(chuàng)建銀行對(duì)象
  Bank bank;
  // 通過構(gòu)造器傳入銀行對(duì)象,確保兩個(gè)人進(jìn)入的是一個(gè)銀行
  public PersonB(Bank bank) {
    this.bank = bank;
  }
  // 重寫run方法,在里面實(shí)現(xiàn)使用柜臺(tái)取錢
  @Override
  public void run() {
    while (Bank.money >= 200) {
      bank.ATM(200);// 每次取200塊
      try {
        sleep(100);// 取完休息0.1秒
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }
}
 

(四)創(chuàng)建主方法的調(diào)用類

package com.xykj.bank;
public class MainClass {
  /**
   * 兩個(gè)人AB通過一個(gè)賬戶A在柜臺(tái)取錢和B在ATM機(jī)取錢
   * */
  public static void main(String[] args) {
    // 實(shí)力化一個(gè)銀行對(duì)象
    Bank bank = new Bank();
    // 實(shí)例化兩個(gè)人,傳入同一個(gè)銀行的對(duì)象
    PersonA pA = new PersonA(bank);
    PersonB pB = new PersonB(bank);
    // 兩個(gè)人開始取錢
    pA.start();
    pB.start();
  }
}

運(yùn)行結(jié)果:

可以看到取完就停止運(yùn)行了。

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

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

要求:

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

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

3.其中一個(gè)跑到終點(diǎn)后另一個(gè)不跑了!

程序設(shè)計(jì)思路:

1.創(chuàng)建一個(gè)Animal動(dòng)物類,繼承Thread,編寫一個(gè)running抽象方法,重寫run方法,把running方法在run方法里面調(diào)用。

2.創(chuàng)建Rabbit兔子類和Tortoise烏龜類,繼承動(dòng)物類

3.兩個(gè)子類重寫running方法

4.本題的第3個(gè)要求涉及到線程回調(diào)。需要在動(dòng)物類創(chuàng)建一個(gè)回調(diào)接口,創(chuàng)建一個(gè)回調(diào)對(duì)象

(一)創(chuàng)建Animal動(dòng)物類

package com.xykj.rabbit_tortoise;
public abstract class Animal extends Thread{
  public double length=20;//比賽的長(zhǎng)度
  public abstract void runing();//抽象方法需要子類實(shí)現(xiàn)
  //在父類重寫run方法,在子類只要重寫running方法就可以了
  @Override
  public void run() {
    super.run();
    while (length>0) {
       runing();
    }
  }
  //在需要回調(diào)數(shù)據(jù)的地方(兩個(gè)子類需要),聲明一個(gè)接口
  public static interface Calltoback{
    public void win();
  }
  //2.創(chuàng)建接口對(duì)象
  public Calltoback calltoback;
}

(二)創(chuàng)建Rabbit兔子類

package com.xykj.rabbit_tortoise;
public class Rabbit extends Animal {
  public Rabbit() {
    setName("兔子");// Thread的方法,給線程賦值名字
  }
  // 重寫running方法,編寫兔子的奔跑操作
  @Override
  public void runing() {
    // 跑的距離
    double dis = 0.5;
    length -= dis;//跑完后距離減少
    if (length <= 0) {
      length = 0;
      System.out.println("兔子獲得了勝利");
      //給回調(diào)對(duì)象賦值,讓烏龜不要再跑了
      if (calltoback != null) {
        calltoback.win();
      }
    }
    System.out.println("兔子跑了" + dis + "米,距離終點(diǎn)還有" + (int)length + "米");
    if (length % 2 == 0) {// 兩米休息一次
      try {
        sleep(1000);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }
}

(三)創(chuàng)建Tortoise烏龜類

package com.xykj.rabbit_tortoise;
public class Tortoise extends Animal {
  public Tortoise() {
    setName("烏龜");// Thread的方法,給線程賦值名字
  }
  // 重寫running方法,編寫烏龜?shù)谋寂懿僮?
  @Override
  public void runing() {
    // 跑的距離
    double dis = 0.1;
    length -= dis;
    if (length <= 0) {
      length = 0;
      System.out.println("烏龜獲得了勝利");
      // 讓兔子不要在跑了
      if (calltoback != null) {
        calltoback.win();
      }
    }
    System.out.println("烏龜跑了" + dis + "米,距離終點(diǎn)還有" + (int) length + "米");
    try {
      sleep(100);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
}

(四)創(chuàng)建一個(gè)讓動(dòng)物線程停止的類,這里要實(shí)現(xiàn)回調(diào)接口

package com.xykj.rabbit_tortoise;
import com.xykj.rabbit_tortoise.Animal.Calltoback;
public class LetOneStop implements Calltoback {
  // 動(dòng)物對(duì)象
  Animal an;
  // 獲取動(dòng)物對(duì)象,可以傳入兔子或?yàn)觚數(shù)膶?shí)例
  public LetOneStop(Animal an) {
    this.an = an;
  }
  //讓動(dòng)物的線程停止
  @Override
  public void win() {
    // 線程停止
    an.stop();
  }
}

(五)創(chuàng)建一個(gè)主方法調(diào)用類,

package com.xykj.rabbit_tortoise;
public class MainClass {
  /**
   * 龜兔賽跑:20米   
   * */
  public static void main(String[] args) {
    //實(shí)例化烏龜和兔子
    Tortoise tortoise = new Tortoise();
    Rabbit rabbit = new Rabbit();
    //回調(diào)方法的使用,誰先調(diào)用calltoback方法,另一個(gè)就不跑了
    LetOneStop letOneStop1 = new LetOneStop(tortoise);
    rabbit.calltoback = letOneStop1;//讓兔子的回調(diào)方法里面存在烏龜對(duì)象的值,可以把烏龜stop
    LetOneStop letOneStop2 = new LetOneStop(rabbit);
    tortoise.calltoback = letOneStop2;//讓烏龜?shù)幕卣{(diào)方法里面存在兔子對(duì)象的值,可以把兔子stop
    //開始跑
    tortoise.start();
    rabbit.start();
  }
}

運(yùn)行結(jié)果:

可以看到結(jié)果兔子贏了。

一般來說兔子獲得了勝利是在最后輸出的,

但是,由于線程一直在執(zhí)行所以會(huì)出現(xiàn):

“兔子跑了0.5米,距離終點(diǎn)還有0米”還沒來得及輸出完,

而“兔子獲得了勝利”已經(jīng)輸出完畢了。

五.實(shí)例四:

在一個(gè)KFC內(nèi),服務(wù)員負(fù)責(zé)生產(chǎn)食物,消費(fèi)者負(fù)責(zé)消費(fèi)食物;

當(dāng)生產(chǎn)到一定數(shù)量可以休息一下,直到消費(fèi)完食物,再馬上生產(chǎn),一直循環(huán)

程序涉及到的內(nèi)容:

1.這設(shè)計(jì)到j(luò)ava模式思想:生產(chǎn)者消費(fèi)者模式

2.要保證操作對(duì)象的統(tǒng)一性,即消費(fèi)者和服務(wù)者都是跟同一個(gè)KFC發(fā)生關(guān)系的,KFC只能new一次

3.this.notifyAll();和this.wait();一個(gè)是所有喚醒的意思,一個(gè)是讓自己等待的意思;

比如本題中,生產(chǎn)者生產(chǎn)完畢后,先所有喚醒(包括消費(fèi)者和生產(chǎn)者),再讓所有自己(生產(chǎn)者)等待

這時(shí),消費(fèi)者開始消費(fèi),直到食材不夠,先所有喚醒(包括消費(fèi)者和生產(chǎn)者),再讓所有自己(消費(fèi)者)等待

一直執(zhí)行上面的操作的循環(huán)

4.生產(chǎn)者和消費(fèi)者都要繼承Thread,才能實(shí)現(xiàn)多線程的啟動(dòng)

程序設(shè)計(jì)的步驟思路:

1.創(chuàng)建一個(gè)食物類Food,有存放/獲取食物的名稱的方法

2.創(chuàng)建一個(gè)KFC類,有生產(chǎn)食物和消費(fèi)食物的方法

3.創(chuàng)建一個(gè)客戶類Customer,繼承Thread,重寫run方法,在run方法里面進(jìn)行消費(fèi)食物操作

4.創(chuàng)建一個(gè)服務(wù)員類Waiter,繼承Thread,重寫run方法,在run方法里面進(jìn)行生產(chǎn)食物的操作

5.創(chuàng)建主方法的調(diào)用類

(一)創(chuàng)建一個(gè)食物類Food

package com.xykj.producer_consumer;
public class Food {
  String name="";
  //通過構(gòu)造方法傳入食物的名字
  public Food(String name) {
    this.name=name;
  }
  //get、set 方法
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
}

(二)創(chuàng)建一個(gè)KFC類

package com.xykj.producer_consumer;
import java.util.ArrayList;
import java.util.List;
public class KFC {
  //食物的種類
  String[] names = { "薯?xiàng)l", "燒板", "雞翅", "可樂" };
  //生產(chǎn)的最大值,到達(dá)后可以休息
  static final int Max = 20;
  //存放食物的集合
  List<Food> foods = new ArrayList<Food>();
  // 生產(chǎn)食物的方法
  public void prod(int index) {
    synchronized (this) {
      // 如果食物數(shù)量大于20
      while (foods.size() > Max) {
        System.out.println("食材夠了");
        this.notifyAll();//這個(gè)喚醒是針對(duì)生產(chǎn)者和消費(fèi)者,有all
        try {
          String name=Thread.currentThread().getName();
          this.wait();//這個(gè)喚醒是針對(duì)生產(chǎn)者,沒有all
          System.out.println("生產(chǎn)者:"+name);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
      }
      // 開始生產(chǎn)食物食物//有一點(diǎn)要注意的
      System.out.println("開始生產(chǎn)食物");
      for (int i = 0; i < index; i++) {
        Food food = new Food(names[(int) (Math.random() * 4)]);
        foods.add(food);
        System.out.println("生產(chǎn)了" + food.getName() + foods.size());
      }
    }
  }
  // 消費(fèi)食物的方法
  public void consu(int index) { 
    synchronized (this) {
      while (foods.size() < index) {
        System.out.println("食材不夠了");
        this.notifyAll();//這個(gè)喚醒是針對(duì)生產(chǎn)者和消費(fèi)者,有all
        try {
          String name=Thread.currentThread().getName();
          this.wait();//這個(gè)喚醒是針對(duì)消費(fèi)者,沒有all
          System.out.println("消費(fèi)者:"+name);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
      }
      // 足夠消費(fèi)
      System.out.println("開始消費(fèi)");
      for (int i = 0; i < index; i++) {
        Food food = foods.remove(foods.size() - 1);
        System.out.println("消費(fèi)了一個(gè)" + food.getName() + foods.size());
      }
    }
  }
}

(三)創(chuàng)建一個(gè)客戶類Customer

package com.xykj.producer_consumer;
public class Customers extends Thread{
  KFC kfc;
  //KFC要傳入,保證每一個(gè)服務(wù)員和用戶在同一個(gè)KFC對(duì)象內(nèi)
  public Customers(KFC kfc) {
    this.kfc=kfc;
  }
  @Override
  public void run() {
    int size=(int)(Math.random()*5);//每次要消費(fèi)的食物的數(shù)量
    while (true) {
      kfc.consu(size);//在消費(fèi)的方法里面?zhèn)魅雲(yún)?shù)
    }
  }
} 

(四)創(chuàng)建一個(gè)服務(wù)員類Waiter

package com.xykj.producer_consumer;
public class Waiter extends Thread{
  KFC kfc;
  //KFC要傳入,保證每一個(gè)服務(wù)員和用戶在同一個(gè)KFC對(duì)象內(nèi)
  public Waiter(KFC kfc) {
    this.kfc=kfc;
  }
  @Override
  public void run() {
    int size=(int)(Math.random()*5)+5;//每次生產(chǎn)的數(shù)量
    while (true) {
      kfc.prod(size);//傳入每次生產(chǎn)的數(shù)量
    }
  }
}

(五)創(chuàng)建主方法的調(diào)用類

package com.xykj.producer_consumer;
public class MainClass {
  /**
   * 生產(chǎn)者消費(fèi)者模式
   *
   * */
  public static void main(String[] args) {
    // 只實(shí)例化一個(gè)KFC對(duì)象,保證每一個(gè)服務(wù)員和用戶在同一個(gè)KFC對(duì)象內(nèi)
    KFC kfc = new KFC();
    //實(shí)例化4個(gè)客戶對(duì)象
    Customers c1 = new Customers(kfc);
    Customers c2 = new Customers(kfc);
    Customers c3 = new Customers(kfc);
    Customers c4 = new Customers(kfc);
    //實(shí)例化3個(gè)服務(wù)員對(duì)象
    Waiter waiter1 = new Waiter(kfc);
    Waiter waiter2 = new Waiter(kfc);
    Waiter waiter3 = new Waiter(kfc);
    //讓所有的對(duì)象的線程都開始工作
    waiter1.start();
    waiter2.start();
    waiter3.start();
    c1.start();
    c2.start();
    c3.start();
    c4.start();
  }
}

六.示例五:設(shè)計(jì)四個(gè)線程對(duì)象對(duì)同一個(gè)數(shù)據(jù)進(jìn)行操作

兩個(gè)線程執(zhí)行減操作,兩個(gè)線程執(zhí)行加操作。

程序分析:

1.創(chuàng)建一個(gè)ThreadAddSub類繼承Thread,重寫run方法

2.在run方法里面實(shí)現(xiàn)加和減的操作,每次操作后睡眠1秒

3.創(chuàng)建主方法調(diào)用類

(一)創(chuàng)建一個(gè)ThreadAddSub類

package com.xykj.add;
public class ThreadAddSub extends Thread {
  //判斷要進(jìn)行的操作
  boolean operate = true;
  //要操作的數(shù)
  static int sum = 0;
  // 把操作運(yùn)算通過構(gòu)造方法傳進(jìn)來
  public ThreadAddSub(boolean operate) {
    super();
    this.operate = operate;
  }
  @Override
  public void run() {
    super.run();
    while (true) {
      if (operate) {
        sum+=5;
        System.out.println("加后,sum="+sum);
      } else {
        sum-=4;
        System.out.println("減后,sum="+sum);
      }
      try {
        sleep(500);// 睡眠0.5秒
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }
}

(二)創(chuàng)建主方法調(diào)用類

emptypackage com.xykj.add;
public class MainClass {
  /**
   * (線程同步)
   * */
  public static void main(String[] args) {
    //創(chuàng)建一個(gè)存放ThreadAddSub對(duì)象的數(shù)組
    ThreadAddSub[] tSub=new ThreadAddSub[4];
    for (int i = 0; i < tSub.length; i++) {
    //把實(shí)例化ThreadAddSub對(duì)象賦值到數(shù)組內(nèi)
    //第一三個(gè)是true,二四個(gè)是false
    tSub[i]=new ThreadAddSub(i%2==0?true:false);
    //讓線程開始工作
    tSub[i].start();
    }
  }
}

線程示例總結(jié):

代碼塊鎖是一個(gè)防止數(shù)據(jù)發(fā)生錯(cuò)誤的一個(gè)重要手段。

對(duì)象的統(tǒng)一性是非常重要的,這要想到對(duì)象的傳入問題,

要操作的對(duì)象只能new一次,其他的操作都是對(duì)這個(gè)傳入的對(duì)象進(jìn)行的,

才能保證數(shù)據(jù)一致性,完整性和正確性。

練習(xí)題目:

1.(多線程)代碼實(shí)現(xiàn)火車站4個(gè)賣票窗口同時(shí)買票的場(chǎng)景,輸出示例:

窗口1賣票

窗口2賣票

窗口1賣票

...

2.(線程同步)代碼實(shí)現(xiàn)火車站4個(gè)窗口同時(shí)賣100張票的代碼邏輯,同一個(gè)窗口不能賣同一

張張票。

3.(線程通信)小明打算去提款機(jī)上取錢,發(fā)現(xiàn)卡上沒錢,這時(shí)候他告知媽媽去存錢,媽媽

存了錢了,告知小明存好了可以取錢了。(PS:小明分多次取錢,每次取100,當(dāng)發(fā)現(xiàn)錢不夠

100,就等待媽媽存錢,小明他媽每次存2000,當(dāng)發(fā)現(xiàn)錢小于100就存錢,就存錢,并且

通知小明去取錢,當(dāng)大于100就等待小明錢不夠是再存)

4.(線程同步)設(shè)計(jì)四個(gè)線程對(duì)象對(duì)同一個(gè)數(shù)據(jù)進(jìn)行操作,兩個(gè)線程執(zhí)行減操作,兩個(gè)線程執(zhí)行

加操作。

5.(線程通信)制作兩個(gè)線程對(duì)象,要求用同步塊的方式使第一個(gè)線程運(yùn)行2次,然后將自己

阻塞起來,喚醒第二個(gè)線程,第二個(gè)線程再運(yùn)行2次,然后將自己阻塞起來,喚醒第一個(gè)線

程……兩個(gè)線程交替執(zhí)行。

6.(線程同步)設(shè)計(jì)4個(gè)線程,其中兩個(gè)線程每次對(duì)j增加1,另外兩個(gè)線程對(duì)j每次減少1。

7.(線程通信)子線程循環(huán)10次,接著主線程循環(huán)100,接著又回到子線程循環(huán)10次,接著

再回到主線程又循環(huán)100,如此循環(huán)50次。

總結(jié)

以上就是本文關(guān)于java多線程編程實(shí)例的全部?jī)?nèi)容,希望對(duì)大家學(xué)習(xí)Java有所幫助,感興趣的朋友可以繼續(xù)參閱本站:淺談Java多線程的優(yōu)點(diǎn)及代碼示例Java多線程之線程通信生產(chǎn)者消費(fèi)者模式及等待喚醒機(jī)制代碼詳解、Java多線程編程實(shí)現(xiàn)socket通信示例代碼等,有什么問題可以隨時(shí)留言,小編會(huì)及時(shí)回復(fù)大家的。感謝朋友們對(duì)本站的支持!

相關(guān)文章

  • 淺談Java基于Consul創(chuàng)建分布式鎖

    淺談Java基于Consul創(chuàng)建分布式鎖

    這篇文章主要介紹了淺談基于Consul創(chuàng)建分布式鎖,Consul是HashiCorp公司推出的開源工具,用于實(shí)現(xiàn)分布式系統(tǒng)的服務(wù)發(fā)現(xiàn)與配置Consul是分布式的、高可用的、可橫向擴(kuò)展的,需要的朋友可以參考下
    2023-07-07
  • 利用Java反射機(jī)制實(shí)現(xiàn)對(duì)象相同字段的復(fù)制操作

    利用Java反射機(jī)制實(shí)現(xiàn)對(duì)象相同字段的復(fù)制操作

    這篇文章主要介紹了利用Java反射機(jī)制實(shí)現(xiàn)對(duì)象相同字段的復(fù)制操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • ConcurrentHashMap線程安全及實(shí)現(xiàn)原理實(shí)例解析

    ConcurrentHashMap線程安全及實(shí)現(xiàn)原理實(shí)例解析

    這篇文章主要介紹了ConcurrentHashMap線程安全及實(shí)現(xiàn)原理實(shí)例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • MybatisPlus將自定義的sql列表查詢返回改為分頁查詢

    MybatisPlus將自定義的sql列表查詢返回改為分頁查詢

    本文主要介紹了MybatisPlus將自定義的sql列表查詢返回改為分頁查詢,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-04-04
  • SpringBoot基于RabbitMQ實(shí)現(xiàn)消息可靠性的方法

    SpringBoot基于RabbitMQ實(shí)現(xiàn)消息可靠性的方法

    RabbitMQ 提供了 publisher confirm 機(jī)制來避免消息發(fā)送到 MQ 過程中丟失,這種機(jī)制必須給每個(gè)消息指定一個(gè)唯一ID,消息發(fā)送到MQ以后,會(huì)返回一個(gè)結(jié)果給發(fā)送者,表示消息是否處理成功,本文給大家介紹了SpringBoot基于RabbitMQ實(shí)現(xiàn)消息可靠性的方法,需要的朋友可以參考下
    2024-04-04
  • java基礎(chǔ)類型源碼解析之多角度講HashMap

    java基礎(chǔ)類型源碼解析之多角度講HashMap

    這篇文章主要給大家介紹了關(guān)于java基礎(chǔ)類型源碼解析之HashMap的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java基具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 深入理解 Java、Kotlin、Go 的線程和協(xié)程

    深入理解 Java、Kotlin、Go 的線程和協(xié)程

    這篇文章主要介紹了深入理解 Java、Kotlin、Go 的線程和協(xié)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Java構(gòu)建工具Gradle的安裝和使用圖文教程

    Java構(gòu)建工具Gradle的安裝和使用圖文教程

    Gradle?是一個(gè)功能強(qiáng)大的構(gòu)建工具,支持自動(dòng)化和定制化的構(gòu)建過程,下面這篇文章主要介紹了Java構(gòu)建工具Gradle的安裝和使用的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-09-09
  • JAVA實(shí)現(xiàn)多線程的兩種方法實(shí)例分享

    JAVA實(shí)現(xiàn)多線程的兩種方法實(shí)例分享

    這篇文章介紹了JAVA實(shí)現(xiàn)多線程的兩種方法實(shí)例分享,有需要的朋友可以參考一下
    2013-08-08
  • Java四種元注解介紹

    Java四種元注解介紹

    元注解是用來修飾注解的注解,在java.lang.annotation包下,當(dāng)我們需要自己定義一個(gè)注解去做某些事情的時(shí)候,我們要對(duì)該注解進(jìn)行一些限制,確保我們注解的作用域,這篇文章主要介紹了Java四種元注解介紹,需要的朋友可以參考下
    2024-08-08

最新評(píng)論

嘉禾县| 内黄县| 云南省| 乐陵市| 乐安县| 柳江县| 堆龙德庆县| 屏边| 赣州市| 海丰县| 呼和浩特市| 和田市| 景洪市| 库车县| 禹州市| 伊通| 绵阳市| 五常市| 马边| 乐业县| 时尚| 淮北市| 南雄市| 弥勒县| 化德县| 永定县| 清新县| 大庆市| 邵阳市| 宾阳县| 马关县| 泽库县| 彭阳县| 营口市| 清流县| 丽水市| 大同市| 广宗县| 城步| 西宁市| 武胜县|