黑马程序员技术交流社区

标题: 创建多线程的第二种方式。 [打印本页]

作者: yangfengxiao    时间: 2012-9-30 16:33
标题: 创建多线程的第二种方式。
毕老师讲到,创建 多线程的第二种方式的两种好处:

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

2.将任务进行了对象的封装,让任务和线程对象分离。降低了耦合性。。 这个好处不是很明白
作者: 夏天    时间: 2012-9-30 17:31
这是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同问的解答,感觉很有用,拿来分享下~~~~
作者: yangfengxiao    时间: 2012-9-30 17:44
夏诗瑶 发表于 2012-9-30 17:31
这是Thread实现说车售票的代码
class MyThread1 extends Thread{        // 继承Thread类,作为线程的实现 ...

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

楼上正解~~




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