黑马程序员技术交流社区
标题:
关于多线程的问题
[打印本页]
作者:
HM何伟
时间:
2013-4-1 22:32
标题:
关于多线程的问题
/*
银行存款
储户,调用的是银行的存款功能
*/
//当钱存进来时,银行计算总余额功能
class Bank{
double sum=0;
public void addMoney(double money)
{
synchronized(this)
{
if (money>0)
try
{ Thread.sleep(20);
}
catch (Exception e)
{
}
sum+=money;
System.out.println(Thread.currentThread().getName()+"总余额"+sum);
}
}
}
//人有存钱的功能
class Person implements Runnable{
Bank b=new Bank();
public void run()
{ //储存五次,一次存300百,总共存1500.
for (int i=1;i<=5 ;i++ )
{
b.addMoney(100);
}
}
}
class Main{
//创建线程,
public static void main(String[] args){
Person p=new Person();
Thread t=new Thread(p);
//Thread t1=new Thread(p);
// Thread t2=new Thread(p);
t.start();
//
t1.start();
// t2.start();
}
}
按理说,三个线程与一个线程执行后,出现的结果是一样.才能体现出多线程比单线程高效.
但当我把后面两个线程开启时,怎会钱的数量会出现到1500呢??求解
作者:
fighting
时间:
2013-4-1 23:01
没有什么问题啊,每个线程都是对同一个Person对象操作的,
所以钱数也是针对同一Person加的,但是因为你对Bank加锁了,
所以。。。和没用多线程效果是一样的。。。
作者:
HM何伟
时间:
2013-4-1 23:10
我的想是这样的,那里不对,上面的代码中的注是忘了修改的
public void run()
{ //储存五次,一次存100百,总共存500.
for (int i=1;i<=5 ;i++ )
{
b.addMoney(100);
}
}
可打印的结果是1500
作者:
HM何伟
时间:
2013-4-1 23:10
我的想是这样的,那里不对,上面的代码中的注是忘了修改的
public void run()
{ //储存五次,一次存100百,总共存500.
for (int i=1;i<=5 ;i++ )
{
b.addMoney(100);
}
}
可打印的结果是1500
作者:
陈丽莉
时间:
2013-4-1 23:13
若还有问题,继续追问; 没有的话,改成【已解决】哦~
作者:
田光峰
时间:
2013-4-3 13:46
原因是这样的:因为person实现了Runnable接口(如示:class Person implements Runnable)所以三个线程使操作的资源是同一个,线程执行后money=500+500+500所以是1500 .
你的要求是打印三个500,那就不能实现Runnable了,就得继承Thread,这样三个线程操作的是各自的资源,打印的结果就是500 ,500, 500
作者:
HM何伟
时间:
2013-4-3 14:01
田光峰 发表于 2013-4-3 13:46
原因是这样的:因为person实现了Runnable接口(如示:class Person implements Runnable)所以三个线程使操 ...
那这样根本就没体现出多线程的高效性呢
作者:
田光峰
时间:
2013-4-3 14:36
再多的线程cpu 一次只能执行一个。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2