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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yangfengxiao 中级黑马   /  2012-9-30 16:33  /  1687 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

毕老师讲到,创建 多线程的第二种方式的两种好处:

1.避免了单继承的局限性。

2.将任务进行了对象的封装,让任务和线程对象分离。降低了耦合性。。 这个好处不是很明白

4 个回复

倒序浏览
这是Thread实现说车售票的代码
class MyThread1 extends Thread{        // 继承Thread类,作为线程的实现类
        private int ticket = 5 ;                // 表示一共有5张票
        public void run(){        // 覆写run()方法,作为线程 的操作主体
                for(int i=0;i<100;i++){
                        if(this.ticket>0){
                                System.out.println("卖票:ticket = " + ticket--) ;
                        }
                }
        }
};
public class ThreadDemo04{
        public static void main(String args[]){
                MyThread1 mt1 = new MyThread1() ;         // 实例化对象
                MyThread1 mt2 = new MyThread1() ;         // 实例化对象
                MyThread1 mt3 = new MyThread1() ;         // 实例化对象
                mt1.start() ;        // 调用线程主体
                mt2.start() ;        // 调用线程主体
                mt3.start();        // 调用线程主体
        }
};
结果
卖票:ticket = 5
卖票:ticket = 5
卖票:ticket = 5
卖票:ticket = 4
卖票:ticket = 4
卖票:ticket = 4
卖票:ticket = 3
卖票:ticket = 3
卖票:ticket = 3
卖票:ticket = 2
卖票:ticket = 2
卖票:ticket = 2
卖票:ticket = 1
卖票:ticket = 1
卖票:ticket = 1
这是Runnable实现火车售票代码
class MyThread implements Runnable{        // 继承Thread类,作为线程的实现类
        private int ticket = 5 ;                // 表示一共有5张票
        public void run(){        // 覆写run()方法,作为线程 的操作主体
                for(int i=0;i<100;i++){
                        if(this.ticket>0){
                                System.out.println("卖票:ticket = " + ticket--) ;
                        }
                }
        }
};
public class RunnableDemo02{
        public static void main(String args[]){
                MyThread mt = new MyThread() ;         // 实例化对象
                new Thread(mt).start() ;        // 调用线程主体
                new Thread(mt).start();        // 调用线程主体
                new Thread(mt).start();        // 调用线程主体
        }
};
结果
卖票:ticket = 5
卖票:ticket = 4
卖票:ticket = 3
卖票:ticket = 2
卖票:ticket = 1
总结来说,使用Thread类操作多线程的时候无法达到资源共享的目的,而Runnable操作多线程的时候可以达到资源共享

这是屈版主回答另一MM同问的解答,感觉很有用,拿来分享下~~~~
回复 使用道具 举报
夏诗瑶 发表于 2012-9-30 17:31
这是Thread实现说车售票的代码
class MyThread1 extends Thread{        // 继承Thread类,作为线程的实现 ...

知道了,谢谢!
回复 使用道具 举报
记住一点,实现了Runnable接口的类就是“任务类”,然后在创建新线程的时候只需要将这个任务类传递给线程对象就可以了。这样一来,任务是任务对象,线程是线程对象,也就做到了任务和线程对象的分离,自然就降低了耦合性。Thread类之所以也可以作为任务类,就是因为Thread类也继承(用实现比较好)了Runnable接口,但是Thread同时又是线程类,如果直接将一个Thread对象传递给一个线程,就出现了耦合的情况:线程对象和任务对象都具有线程的功能
回复 使用道具 举报
王海宇 发表于 2012-9-30 18:01
记住一点,实现了Runnable接口的类就是“任务类”,然后在创建新线程的时候只需要将这个任务类传递给线程对 ...

楼上正解~~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马