java 从零开始,学习笔记之基础入门<线程及实例分析>(十九)(四)

2014-11-24 08:29:18 · 作者: · 浏览: 2
rityDemo03();
PriorityDemo02 pd2=new PriorityDemo02();
pd3.setName("线程2");
pd2.setName("线程1");
//将线程pd3的优先级设置为最小,那么它访问cpu的优先的机率也变小了
pd3.setPriority(1);
//将pd2的优先级设置为最大,那么它访问cpu的优先级机率就变大了
pd2.setPriority(10);
//优先级大的线程比优先级小的线程优先访问cpu的机率大
pd3.start();
pd2.start();
}
}
wait()、 notify()、notifyAll()
wait() 使线程处于等待状态,那么此线程需要线程监视器来唤醒等待的线程接着执行
notify() 唤醒单个的线程使线程从等待状态转变成运行状态
notifyAll() 唤醒全部处于等待的线程
package com.ibm.wait;
public class WaitDemo extends Thread{
// wait notify 和notifyAll方法不是出自于Thread而是出自于Object类
//而Thread继承Object类就将对应的3个方法继承过去了
// wait() 使线程处于等待状态,那么此线程需要线程监视器来唤醒等待的线程接着执行
// notify()唤醒单个的线程使线程从等待状态转变成运行状态
// notifyAll()唤醒全部处于等待的线程
//有一个银行账户 一个人甲对此账户进行存800块钱,
//那么另外一个人就立马将这个账户中的钱取出来,始终保持账户中没有钱
//一个人甲存完钱之后,那么唤醒乙线程去取钱,乙取完钱之后,乙线程处于等待状态,在乙线程中
//唤醒甲线程取钱,最终甲乙线程只能有一个运行一个就是等待 需要创建二个线程类和一个账户类,
//还一个测试类 WaitDemo
public static void main(String[] args) {
//创建账号
Account a=new Account("中国银行",0);
//创建存钱的线程类
QuitDemo qd=new QuitDemo(a, 200);
qd.start();
SaveDemo ad=new SaveDemo(a, 200);
ad.start();
}
}
package com.ibm.wait;
public class Account {
//账号
//金额
//标记 boolean 用来标示账户中有没有钱
private String accountname;
private double accountmoney = 0;
boolean flag =false;// 就是用来标明存钱与取钱 false表明取钱 true表明存钱
public Account(String accountname,double accountmoney) {
this.accountname = accountname;
this.accountmoney = accountmoney;
}
//加上取到余额的方法
public double getAccountmoney() {
returnaccountmoney;
}
//定义二个方法一个方法存钱,一个方法取钱
//存钱
public synchronized void insertMoney(double money) {
if (flag ==true) {
try {
//存钱的线程处于等待状态
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
//存钱
accountmoney += money;
//存完钱之后是不是要账户的状态改为true
System.out.println(Thread.currentThread().getName() +"存的钱数:"
+ money);
flag =true;
//唤醒处于等待状态的取钱线程
notifyAll();
}
}
//取钱
public synchronized void selectMoney(double money) {
if (!flag) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
//取钱
accountmoney =accountmoney - money;
System.out
.println(Thread.currentThread().getName() +"取钱为" + money);
System.out.println("----余额为:---" + accountmoney);
//将账户状态改为false
flag =false;
//唤醒存钱的线程往账户中存钱
notifyAll();
}
}
}
package com.ibm.wait;
public class SaveDemo extends Thread {
Account a;
//定义一个你要存的钱数
double money;
public SaveDemo(Account a,double money){
this.a=a;
this.money=money;
}
public void run(){
for(int i=0;i<20;i++){
a.insertMoney(money);
}
}
}
pack