黑马程序员技术交流社区
标题:
如果你能自己写出毕老师的多线程代码,你的多线程学的也差不多了
[打印本页]
作者:
嘿~~
时间:
2014-8-17 17:42
标题:
如果你能自己写出毕老师的多线程代码,你的多线程学的也差不多了
import java.util.concurrent.locks.*;
class Account
{
private String name;
private int count;
private final Lock lock = new ReentrantLock();
private Condition condition_drawer = lock.newCondition();//将取钱的动作绑定到锁上
private Condition condition_deposite = lock.newCondition();//将存钱的动作绑定到锁上
private boolean flag = false;
Account(String name){
this.name = name;
}
public String getName(){
return name;
}
public void draw()throws InterruptedException{
lock.lock();
try{
if(!flag)//在此处判断旗标为真时等待,保证账户有钱才能取
condition_drawer.await();
else{
System.out.println(Thread.currentThread().getName()+"---取钱-->>"+count);
try{Thread.sleep(100);}catch(InterruptedException e){}
flag = false;
condition_deposite.signalAll();
}
}finally{
lock.unlock();//释放锁定义在finally块里,锁一定被释放,以免线程阻塞
}
}
public void deposite()throws InterruptedException{
lock.lock();
try{
if(flag)
condition_deposite.await();//方法await()会抛出InterruptedException异常
else{
//因为账户必须先有钱才能取钱,因此count在此处自增,并且使用前自增,先增后用,保证存取数目一致
System.out.println(Thread.currentThread().getName()+"-----------存钱----->>"+(++count));
try{Thread.sleep(100);}catch(InterruptedException e){}
flag = true;
condition_drawer.signalAll();
}
}finally{
lock.unlock();//释放锁定义在finally块里,锁一定被释放,以免线程阻塞
}
}
}
class Draw extends Thread
{
private Account account;
Draw(String name,Account account){
super(name);
this.account = account;
}
public void run()//覆盖Thread类的run方法,不能抛出异常
{
while(true){
try
{
account.draw();
}
catch (InterruptedException e)
{
}
}
}
}
class Deposite extends Thread
{
private Account account;
Deposite(String name,Account account){
super(name);
this.account = account;
}
public void run()//覆盖Thread类的run方法,不能抛出异常
{
while (true)
{
try
{
account.deposite();
}
catch (InterruptedException e)
{
}
}
}
}
class DrawThread01
{
public static void main(String[] args)
{
Account account = new Account("中国银行");
Draw dr1 = new Draw("顾客张三******",account);
Draw dr2 = new Draw("顾客梅梅******",account);
Deposite de1 = new Deposite("*****顾客李四",account);
Deposite de2 = new Deposite("*****顾客陈留",account);
dr1.start();
dr2.start();
de1.start();
de2.start();
}
}
复制代码
作者:
3040789425
时间:
2014-8-17 18:21
这个代码不难好不 ,关键是思路问题
作者:
落幕繁华
时间:
2014-8-17 18:29
为什么用继承Thread。实现runable不好吗,
作者:
嘿~~
时间:
2014-8-17 21:47
落幕繁华 发表于 2014-8-17 18:29
为什么用继承Thread。实现runable不好吗,
实现Runnable接口,我不知道在打印语句中怎么打印出自定义的线程名字
作者:
单线程xia
时间:
2014-8-17 21:54
这标题。。。。
作者:
wawsc5354524
时间:
2014-8-18 00:21
初学者看到100行以上的代码都觉得好牛B
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2