併發的現象,第一個爲參考網上寫的,第二個爲自己寫的
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即可解決,更高級的方法,研究中