關於多線程併發的小實驗

併發的現象,第一個爲參考網上寫的,第二個爲自己寫的

package com.joker.threads.demo;

//這個爲轉載來的,自己入門用
public class TicketOffice {
private int ticket = 0;
public TicketOffice(int ticketNum){
this.ticket = ticketNum;
}
public int getTicket() {
return ticket;
}
public void setTicket(int ticket) {
this.ticket = ticket;
}
public void sellTicket(){
ticket--;
if(ticket>=0){
System.out.println("售票成功:"+"剩餘:"+ticket);
}else {
System.out.println("沒有票了");
}
}
public static void main(String[] args) {
final TicketOffice ticketOffice = new TicketOffice(100);
for(int i=0;i<10;i++){
new Thread(){
public void run() {
while (ticketOffice.getTicket()>0) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
ticketOffice.sellTicket();
}
};
}.start(); 
}
}
}

打印結果:


自己寫的,模擬的是銀行的例子,三條線程,一個存,一個取,一個查

代碼如下

package com.joker.threads.demo;


public class Bank {
private int count;


public int getCount() {
return count;
}


public void setCount(int count) {
this.count = count;
}
public Bank(int count){
this.count = count;
}
public void addMoney(int money){
if(count>0){
count = count+money;
System.out.println("存款成功餘額爲:"+getCount());
}else {
System.out.println("餘額小於0,存款失敗");
}
}
public void takeMoney(int money){
if(count>0){
count = count-money;
System.out.println("取款成功餘額爲:"+getCount());
}else {
System.out.println("餘額小於0,取款失敗");
}
}
public void checkMoney(){
System.out.println("查詢金額:"+getCount());
}
public static void main(String[] args) {
final Bank bank = new Bank(100);
ManA a = new ManA(bank);
ManB b = new ManB(bank);
ManC c = new ManC(bank);
for(int i=0;i<10;i++){
// while (true) {
new Thread(a).start();
new Thread(c).start();
new Thread(b).start();
}

}
static class ManA implements Runnable{
private Bank bank;
public ManA(Bank bank){
this.bank = bank;
}
public void run() {
bank.addMoney(10);
// try {
// Thread.sleep(500);
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }

}
static class ManB implements Runnable{
private Bank bank;
public ManB(Bank bank){
this.bank = bank;
}
public void run() {
// try {
// Thread.sleep(500);
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
bank.takeMoney(10);

}
static class ManC implements Runnable{
private Bank bank;
public ManC(Bank bank){
this.bank = bank;
}
public void run() {
bank.checkMoney();

}
}

結果爲:


傳統的方法,synz即可解決,更高級的方法,研究中

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章