一、多线程运行问题
-
各个线程是通过竞争CPU时间而获得运行机会的
-
各线程什么时候得到CPU时间,占用多久,是不可预测的
-
一个正在运行着的线程在什么地方被暂停是不确定的
二、线程同步
-
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); } }
-
使用场景
--成员方法 public synchronized void savaAccount(){}
--静态方法 public static synchronized void savaAccount(){}
--语句块 synchronized (obj){......}
三、线程间通信
- 方法
--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;
}