黑马程序员技术交流社区

标题: 为什么说继承了Thread以后不能实现资源的共享 [打印本页]

作者: 段郎    时间: 2014-4-29 01:27
标题: 为什么说继承了Thread以后不能实现资源的共享
学习毕老师的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
....
为什么说资源不能共享呢????




作者: Silvester    时间: 2014-4-29 01:53
        楼主的资源就是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才能输出,这么解释不知道能不能对楼主有帮助。
作者: ς高眼光の目标    时间: 2014-4-29 02:10
是关于锁的问题?

作者: fendoubuxi    时间: 2014-4-29 02:10
楼主你的做法没问题,因为你是用同一个对象开始的2条线程,run方法当然只能访问同一个n。毕老师的讲课的时候用的是不同的对象所以没能共享资源。其实如果单从程序的实现来说,继承Tread和实现Runnable没什么区别,都能达到一样的效果。但是java是单继承的,这个类和线程其实没什么关系,却为了调用里面的方法而继承。




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