好久,没写代码了, 利用多余的时间,写一个简单的多线程例子,巩固一下,以前学习的多线程知识..
线程 Thread 类,和 Runable 接口 比较两者的特点和应用领域.
可以,直接继承线程Thread类。该方法编写简单,可以直接操作线程,适用于单重继承情况,因而不能在继承其他类
实现Runnable接口。当一个线程已继承了另一个类时,就只能用实现Runnable接口的方法来创建线程,且便于保持程序风格的一致性。
我们知道,一个具有生命的线程,具有下面五种状态:
创建状态
使用new运算符创建一个线程后,该线程仅仅是一个空对象,系统没有分配资源,称该线程处于创建状态(new thread)
可运行状态
使用start()方法启动一个线程后,系统为该线程分配了除CPU外的所需资源,使该线程处于可运行状态(Runnable)
运行中状态
Java运行系统通过调度选中一个Runnable的线程,使其占有CPU并转为运行中状态(Running)。此时,系统真正执行线程的run()方法。
阻塞状态
一个正在运行的线程因某种原因不能继续运行时,进入阻塞状态(Blocked)
死亡状态
线程结束后是死亡状态(Dead)
废话不多说,下面直接上代码:
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; } }
package pack.java.thread.atm; 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()+"元"); } } }
package pack.java.thread.atm; import java.io.Serializable; /** * 存款线程类; * @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()+"元"); } } }
package pack.java.thread.atm; /** * 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元