本帖最后由 qixing0918 于 2013-10-24 09:10 编辑
以前写过一次 再写一次希望对你有帮助
1.首先两种继承的区别
无论是继承Thread类的线程 还是实现接口runable的线程 都是通过Thread类start()方法调用完成的 这个类就像是工人 而线程就是工作
2.其次看实现方式
class A extends Thread
{
}
class B implements runnable
{
}
//测试
因为 A 是继承Thread 所以直接调用 start()就行
A a1 = new A() ; // 实例化对象
A a2= new A() ; // 实例化对象
A a3 = new A() ; // 实例化对象
a1.start() ; // 调用线程主体
a2.start() ; // 调用线程主体
a3.start() ; // 调用线程主体
而 B是是实现了接口 runnable (其实 thread 类也实现了runnable 接口 并保存了 runable的引用 实现start()方法都是通过调用runnable实现的 就像是监听者模式的 notifyAll()方法一样)
B b = new B() ; // 实例化对象
new Thread(b).start() ; // 调用线程主体
new Thread(b).start() ; // 调用线程主体
new Thread(b).start() ; // 调用线程主体
实现方式是不很不同 A 就像一个工人一个任务 B 则是多个工人一个任务
其实都是调用你定义的线程A 或 B 的run()方法
那问题来了 怎么不直接调用 而用start() 呢 (start()也是调用run())
我感觉就是 跟底层有关 也就是你在main线程中调用新线程 是跟jvm 跟系统cpu有关的
1、Runnable适合于多个相同程序代码线程去处理统一资源的情况,把虚拟的cpu(线程)同程序的代码,数据有效分离,较好体现面向对象的编程的思想
2、Runnable可以避免由于java的单继承机制带来的局限。可以再继承其他类的同时,还能实现多线程的功能。
3、Runnable能增加程序的健壮性。代码能够被多个线程共享。
如果都完成3个任务
3个工人去完成3个任务 有两种
1. 3个人 每个人完成一个任务 3个人完成3个
2. 3个人一起完成一个 两个 三个
效率是一样的 只是一个任务的完成方式不同而已
|