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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

学习毕老师的Java多线程是说继承了Thread以后不能实现资源的共享,有点搞不明白
如果用下面的方面做的话:
package test;
class MyThread extends Thread{
        private int n = 10;
        public void run(){
                while(n > 0){
                        System.out.println(Thread.currentThread().getName()+"--->"+this.n --);
                }
        }
}
public class TestThread {
        public static void main(String[] args) {
                MyThread mt = new MyThread();
                new Thread(mt).start();
                new Thread(mt).start();
        }
}
运行的结果是:
Thread-2--->3
Thread-2--->2
Thread-2--->1
Thread-1--->6
....
为什么说资源不能共享呢????



评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

3 个回复

倒序浏览
        楼主的资源就是n,两个线程确实没有共享资源n,运行程序以后,n的值打印出来的时候并没有重复,如果n的值重复了,才能算是资源被共享了,其实n的值是两个线程交替访问,并没有共享资源n.
        根据楼主的结果,估计楼主的问题是在打印的时候为什么没有按顺序(10,9,8,7,6,5,4,3,2,1)打印,其实问题在于两个线程对CPU和IO的抢占,当Thread-1本应该打印6的时候(此时已经释放CPU,接下来要占据IO然后输出6),但Thread-2抢占了CPU和IO(或者是IO就一直没有被Thread-2释放),而Thread-1不仅被暂时阻塞,同时也没抢占到IO,所以数据任然存在寄存器或者内存中,所以推迟了输出,只有Thread-2释放IO以后Thread-1才能输出,这么解释不知道能不能对楼主有帮助。

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
是关于锁的问题?
回复 使用道具 举报
楼主你的做法没问题,因为你是用同一个对象开始的2条线程,run方法当然只能访问同一个n。毕老师的讲课的时候用的是不同的对象所以没能共享资源。其实如果单从程序的实现来说,继承Tread和实现Runnable没什么区别,都能达到一样的效果。但是java是单继承的,这个类和线程其实没什么关系,却为了调用里面的方法而继承。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马