各个线程是通过竞争CPU时间而获得运行机会的
各线程什么时候获得CPU,占用多久,是不可预测的
一个在运行的线程在什么地方被暂停是不确定的
package Threadproj;
public class Bank {
private String account;
private int balance;
public Bank(String account, int balance) {
super();
this.account = account;
this.balance = balance;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public int getBalance() {
return balance;
}
public void setBalance(int balance) {
this.balance = balance;
}
@Override
public String toString() {
return account+"账户的余额为:"+balance;
}
//存钱
public void saveAcount() {
int balance = getBalance();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
balance+=100;
setBalance(balance);
System.out.println("账户的余额为:"+balance);
}
//取钱
public void drawAcount() {
int balance = getBalance();
balance-=200;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//修改账户余额
setBalance(balance);
System.out.println("取钱后账户的余额为:"+balance);
}
public static void main(String[] args) {
}
}
package Threadproj;
public class SaveAccount implements Runnable{
Bank bank;
public SaveAccount(Bank bank) {
this.bank=bank;
}
public void run() {
bank.saveAcount();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
package Threadproj;
public class DrawAccount implements Runnable{
Bank bank;
public DrawAccount(Bank bank) {
this.bank=bank;
}
@Override
public void run() {
// TODO Auto-generated method stub
bank.drawAcount();
}
}
package Threadproj;
public class Test {
public static void main(String[] args) {
Bank bank = new Bank("1",1000);
SaveAccount sa = new SaveAccount(bank);
DrawAccount da = new DrawAccount(bank);
//创建线程对象
Thread saa = new Thread(sa);
Thread daa = new Thread(da);
saa.start();
daa.start();
try {
saa.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
daa.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(bank);
}
}
我们存钱的操作是+100,取钱的操作是-300,那为什么会出现现在的情况呢,就是我们开头阐述的,每个线程的开始和停止时间是不一定的,下一篇会给出解决方案