黑马程序员技术交流社区

标题: 线程问题 [打印本页]

作者: MVP    时间: 2014-3-12 16:47
标题: 线程问题
*
需求:
有一个银行
银行有一个金库
有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次,这样理解错误在哪?
作者: 上官睿鹏    时间: 2014-3-12 17:01
Thread t1 = new Thread(c);
  Thread t2 = new Thread(c);
t1.start();
  t2.start();
这里是创建了两个线程,启动一个线程调用一次run方法(而你的理解是两个线程共同处理一个run()方法),run方法执行一次for循环三次也就是往里面存了三次。那执行两次当然要存六次了~~~
不知道这样说能不能明白?
作者: 菜小徐    时间: 2014-3-12 17:09
Runnable是共享同一个资源的,就好比有两辆车要过一条小路,但是小路只有一辆车的宽度,所以他们只能一个一个过,而不能同时通过。
作者: 黄翔    时间: 2014-3-12 17:20
public interface Runnable 接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为 run 的无参数方法。 也就是说想使用多线程的话就要实现这个接口。
Thread t1 = new Thread(c);
  Thread t2 = new Thread(c);
  t1.start();
  t2.start();创建了两个线程并将Custorm对象传入线程,然后两个线程分别被start启动,执行run方法。
结果是每个线程都执行了3次存钱。至于是两个线程谁先执行,又或者具体的细节,不用关心。






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2