黑马程序员技术交流社区

标题: 大家看看这段程序,帮忙解释下 [打印本页]

作者: 付剑翊    时间: 2014-9-8 11:16
标题: 大家看看这段程序,帮忙解释下
  1. class Demo extends Thread
  2. {
  3.         private int i ;
  4.         synchronized public void run(){
  5.                 for( i = 0;i<30;i++)
  6.                 System.out.println(currentThread().getName()+"  i = "+i);
  7.         }
  8. }

  9. class  ThreadDemo
  10. {
  11.         public static void main(String[] args)
  12.         {
  13.                 Thread t1 = new Demo();
  14.                 t1.start();
  15.                 t1.run();
  16.         }
  17. }
复制代码

为什么main线程和t1都是从0打印到29啊,其中一个不是把堆内存里的i改成29,另外的一个线程就不应该打印东西了啊
作者: 夜半风    时间: 2014-9-8 11:38
i不是局部变量吗
作者: 十万一千    时间: 2014-9-8 18:38
public class Tt {
        public static void main(String[] args) {
                Thread t1 = new Demo();
                t1.start();
                t1.run();
        }
}

class Demo extends Thread {
        private int i;
        private int x;

        synchronized public void run() {
                for (i = 0; i < 30; i++) {
                        x++;
                        System.out.println(currentThread().getName() + "  i = " + i + " x=" + x);
                }
        }
}

测试case用我这个试一试。

作者: daoqin    时间: 2014-9-9 11:21
楼主,你晓得Thread.start() 和Thread.run()方法的区别吗?
我尽最大努力把问题解释清楚,不足之处,请赐教!
首先,之所以出现线程,就是为了更好的利用CPU,让她更加“精明”的干活。
1。。通过调用Thread类的start()方法来启动一个线程,这时此线程是处于就绪状态,并没有运行。然后通过此Thread类调用方法run()来完成其运行操作的,
这里方法run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程终止,而CPU再运行其它线程,

2。。而如果直接用Run方法,这只是调用一个方法而已,程序中依然只有主线程--这一个线程,其程序执行路径还是只有一条,这样就没有达到写线程的目的,而线程就是为了更好地利用CPU,提高程序运行速率的!
你的代码中既有start方法也加了run方法,所以主线程和T1线程都运行
start 方法运行T1;
run方法运行了主线程;

还是认真学习一下多线程吧,加油。

作者: clh    时间: 2014-9-9 11:47
每次调用都被重新赋值了,注意那个private表示私有,不是static,如果是static,则是29 了
作者: 付剑翊    时间: 2014-9-17 12:51
clh 发表于 2014-9-9 11:47
每次调用都被重新赋值了,注意那个private表示私有,不是static,如果是static,则是29 了 ...

谢谢回复!




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