實現Runnable接口。當一個線程已繼承了另一個類時,就只能用實現Runnable接口的方法來創建線程,且便於保持程序風格的一致性。
我們知道,一個具有生命的線程,具有下面五種狀態:
創建狀態
使用new運算符創建一個線程後,該線程僅僅是一個空對象,系統沒有分配資源,稱該線程處於創建狀態(new thread)
可運行狀態
使用start()方法啟動一個線程後,系統為該線程分配了除CPU外的所需資源,使該線程處於可運行狀態(Runnable)
運行中狀態
Java運行系統通過調度選中一個Runnable的線程,使其占有CPU並轉為運行中狀態(Running)。此時,系統真正執行線程的run()方法。
阻塞狀態
一個正在運行的線程因某種原因不能繼續運行時,進入阻塞狀態(Blocked)
死亡狀態
線程結束後是死亡狀態(Dead)
廢話不多說,下面直接上代碼:
Java代碼:
代碼如下:
package pack.java.thread.atm;
/**
* 賬戶類;
* @author Administrator
*
*/
public class Account {
private String name; //用戶名;
private int value; //賬戶余額;
/**
* 存入金額;
* @param monery
*/
public void putMonery(int monery){
this.value = this.value + monery;
}
/**
* 取出金額;
* @param monery
* @return 金額;
*/
public int getMonery(int monery){
//判斷是否賬戶余額是否大於 要取出的錢;
if(this.value > monery ){
this.value = this.value - monery;
}else{
monery = this.value; //賬戶余額不夠時,則取出,所有的賬戶余額的金額.
this.value = 0;
}
//返回取出的錢;
return monery;
}
/**
* 查詢余額;
* @return 返回賬戶余額;
*/
public int search(){
return this.value;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
java代碼:
代碼如下:
import java.io.Serializable;
/**
* 取款線程類;
* @author Administrator
*
*/
public class FetchMoney extends Thread implements Serializable{
private static final long serialVersionUID = -5059599151558445815L;
private Account account; //賬戶對象;
private int monery; //余額;
public FetchMoney(){
super();
}
public FetchMoney(int monery,Account account){
this.account = account;
this.monery = monery;
}
@Override
public void run() {
// TODO Auto-generated method stub
int currMonery = account.search(); //當前余額;
synchronized (account) {
try {
sleep(5); //取款發費的時間;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//取出余額;
int getMonery = account.getMonery(monery);
System.out.println("尊敬的"+account.getName()+"用戶您好!"+"當前的余額為:"+currMonery +"元."+"取出余額為:"+getMonery+"元."+"賬戶余額為:"+account.search()+"元");
}
}
}
java代碼:
代碼如下:
/**
* 存款線程類;
* @author Administrator
*
*/
public class SaveMoney extends Thread implements Serializable{
private static final long serialVersionUID = 3095120546560212724L;
private Account account; //賬戶對象;
private int money; //金額;
public SaveMoney(){
super();
}
public SaveMoney(int money,Account account){
this.account = account;
this.money = money;
}
@Override
public void run() {
// TODO Auto-generated method stub
int currMonery = account.search(); //查詢賬戶余額;
//同步對象,只允許單線程操作;
synchronized (account) {
try {
sleep(5); //查詢的時候,發費得時間;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
account.putMonery(this.money); //插入金額;
//輸出存款信息;
System.out.println("尊敬的"+account.getName()+"用戶您好!"+"當前的余額為:"+currMonery +"元."+"存入余額為:"+this.money+"元."+"賬戶余額為:"+account.search()+"元");
}
}
}
java代碼:
代碼如下:
/**
* ATM測試類;
* @author Administrator
*
*/
public class ThreadATMDemo {
/**
* 主方法;
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Account account = new Account();
//設置用戶名;
account.setName("ZhouHaiTao");
//初始化余額;
account.setValue(0);
//存入100;
new SaveMoney(100,account).start();
//存入200;
new SaveMoney(200, account).start();
//取出500;
new FetchMoney(500, account).start();
}
}
程序運行結果如下:
尊敬的ZhouHaiTao用戶您好!當前的余額為:0元.存入余額為:100元.賬戶余額為:100元
尊敬的ZhouHaiTao用戶您好!當前的余額為:0元.存入余額為:200元.賬戶余額為:300元
尊敬的ZhouHaiTao用戶您好!當前的余額為:0元.取出余額為:300元.賬戶余額為:0元