黑马程序员------学习笔记(7)多线程

来源:互联网 发布:dapaolu域名更换mp4 编辑:程序博客网 时间:2024/06/07 00:12

——- android培训、java培训、期待与您交流! ———-

使用Runnable接口实现多线程需要两个步骤,首先实现Runnable接口类,然后声明Thread实例,调用thread实例的start方法,开始执行。

/** * 张三跟他妻子去取款。 * 银行卡里有500,为了防止他们多取。那么,如果张三在取款, * 那么他妻子就需要等待,反之,张三需要等待。这里用到了(synchronized) * *有两个并发线程访问同一个银行账户对象中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。 * * */public class Test {    public static void main(String[] args) {        TestAccout a = new TestAccout();        new Thread(a,"张三的妻子").start();        new Thread(a,"张三").start();    }}
//银行账户类public class Account {private int balanct = 500;//余额public int getBalanct() {    return balanct;}public void setBalanct(int balanct) {    this.balanct = balanct;}//计算余额public void withdraw(int amount){    balanct = balanct - amount;}}
/** * 取款线程类 * *RunTask类实现了Runnable的接口 *从java的Thread类继承实现多线程,也是实现其run方法,然后声明实例,并调用实例的start方法启动线程。 */public class TestAccout implements Runnable{  private Account acct = new Account();    @Override    public void run() {    for(int i=1;i<5;i++){        makeWithdrawal(100);        if(acct.getBalanct()<0){            System.out.println("账户透支了!");        }    }        }    private void makeWithdrawal(int amt){        //加锁        synchronized (acct) {            if(acct.getBalanct()>=amt){            System.out.println(Thread.currentThread().getName()+"准备取款");            try {                //0.5秒后实现取款                Thread.sleep(500);                  } catch (InterruptedException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }            //如果余额足够则取款            acct.withdraw(amt);            System.out.println(Thread.currentThread().getName()+"完成取款");            }else{                //余额不足给出提示                System.out.println("余额不足以支付"+                Thread.currentThread().getName()+"的取款,余额为:"+acct.getBalanct());            }}    }}

——- android培训、java培训、期待与您交流! ———-

0 0