A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© MVP 中级黑马   /  2014-3-12 16:47  /  1754 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

*
需求:
有一个银行
银行有一个金库
有2个客户同时存钱 每次存100 存三次
*/
class Bank
{
private int sum;
public synchronized void add(int n)
{
  sum = sum + n;
  try{Thread.sleep(10);}catch(Exception e){}
  System.out.println(Thread.currentThread()+"sum:"+sum);
}
}
class Custorm implements Runnable
{
private Bank b = new Bank();
public void run()
{
  for (int x = 0; x < 3; x++ )
  {
   b.add(100);
  }
}
}
class  BankDemo
{
public static void main(String[] args)
{
  Custorm c = new Custorm();
  
  Thread t1 = new Thread(c);
  Thread t2 = new Thread(c);
  t1.start();
  t2.start();
}
}

这毕老师的线程视频章节的代码。我有个疑问,不是说Runnable 是共享同一个资源的,操作同一个run()方法吗,为什么运行后的代码会是存了6次,不应该只是存3次吗?我的理解是两个线程共同处理一个run()方法,所以只有3次,这样理解错误在哪?

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

3 个回复

倒序浏览
Thread t1 = new Thread(c);
  Thread t2 = new Thread(c);
t1.start();
  t2.start();
这里是创建了两个线程,启动一个线程调用一次run方法(而你的理解是两个线程共同处理一个run()方法),run方法执行一次for循环三次也就是往里面存了三次。那执行两次当然要存六次了~~~
不知道这样说能不能明白?

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
Runnable是共享同一个资源的,就好比有两辆车要过一条小路,但是小路只有一辆车的宽度,所以他们只能一个一个过,而不能同时通过。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
public interface Runnable 接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为 run 的无参数方法。 也就是说想使用多线程的话就要实现这个接口。
Thread t1 = new Thread(c);
  Thread t2 = new Thread(c);
  t1.start();
  t2.start();创建了两个线程并将Custorm对象传入线程,然后两个线程分别被start启动,执行run方法。
结果是每个线程都执行了3次存钱。至于是两个线程谁先执行,又或者具体的细节,不用关心。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马