Java多线程(下)

一、多线程运行问题

  • 各个线程是通过竞争CPU时间而获得运行机会的

  • 各线程什么时候得到CPU时间,占用多久,是不可预测的

  • 一个正在运行着的线程在什么地方被暂停是不确定的

二、线程同步

  1. synchronized关键字

    public void drawAccount() { 
    synchronized (this) {
    // 在不同的位置处添加sleep方法
    // 获得当前的帐户余额
    int balance = getBalance();
    // 修改余额,取200
    balance = balance-200; 
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block 
    e.printStackTrace();
    }
    // 修改帐户余额
    setBalance(balance);
    System.out.println("取款后的帐户余额:"+ balance);
    }
    }
  2. 使用场景

    --成员方法 public synchronized void savaAccount(){}

    --静态方法 public static synchronized void savaAccount(){}

    --语句块  synchronized (obj){......}

三、线程间通信

  1. 方法

    --Wait()方法:中断方法的执行,使线程等待。(单独使用就会出现死锁,需与以下方法对应使用)

    --Notify()方法:唤醒处于等待的某一个线程,使其结束等待。

    --NotifyAll()方法:唤醒所有处于等待的线程,使其结束等待。(一般使用该方法)

public synchronized int get(){
if(!flag){
try{
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("消费:"+n);
flag=false;//消费完毕,容器中没有数据
notifyAll();
return n;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值