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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 付剑翊 中级黑马   /  2014-9-8 11:16  /  1200 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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,另外的一个线程就不应该打印东西了啊

评分

参与人数 1技术分 +1 收起 理由
付江涛 + 1 淡定

查看全部评分

5 个回复

倒序浏览
i不是局部变量吗
回复 使用道具 举报
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用我这个试一试。
回复 使用道具 举报
楼主,你晓得Thread.start() 和Thread.run()方法的区别吗?
我尽最大努力把问题解释清楚,不足之处,请赐教!
首先,之所以出现线程,就是为了更好的利用CPU,让她更加“精明”的干活。
1。。通过调用Thread类的start()方法来启动一个线程,这时此线程是处于就绪状态,并没有运行。然后通过此Thread类调用方法run()来完成其运行操作的,
这里方法run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程终止,而CPU再运行其它线程,

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

还是认真学习一下多线程吧,加油。
回复 使用道具 举报
每次调用都被重新赋值了,注意那个private表示私有,不是static,如果是static,则是29 了
回复 使用道具 举报 1 0
clh 发表于 2014-9-9 11:47
每次调用都被重新赋值了,注意那个private表示私有,不是static,如果是static,则是29 了 ...

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