一种是new Thread对象直接代理,另一种是设计Proxy代理类模仿Thread方法实现代理,后一种运用于某类因为继承了父类而不能继承Thread类时使用。
dog.start(); 这里不能调用start,因为Runnable没有start方法
创建了Thread对象,把 dog对象(实现Runnable),放入Thread
这样可以由thread来代理,因为thread类有start方法,静态代理
!自定义Tiger继承了Animal类因此无法再实现Thread类,所以设计了Proxy代理类模仿了Thread类的方法
package thread;
/**
* @author Akita Hooyu
* @version 1.0
*/
public class Thread02 {
public static void main(String[] args) {
Dog dog = new Dog();
//dog.start(); 这里不能调用start,因为Runnable没有start方法
//创建了Thread对象,把 dog对象(实现Runnable),放入Thread
//这样可以由thread来代理,因为thread类有start方法,静态代理
Thread thread = new Thread(dog);
thread.start();
// Tiger tiger = new Tiger();//实现了 Runnable
// ThreadProxy threadProxy = new ThreadProxy(tiger);
// threadProxy.start();
}
}
//class Animal {
//}
//
//class Tiger extends Animal implements Runnable {
// 解读!自定义Tiger继承了Animal类因此无法再实现Thread类,所以设计了Proxy代理类模仿了Thread类的方法
//
// @Override
// public void run() {
// System.out.println("老虎嗷嗷叫....");
// }
//}
线程代理类 , 模拟了一个极简的Thread类
//class ThreadProxy implements Runnable {//把Proxy类当做 ThreadProxy
//
// private Runnable target = null;//属性,类型是 Runnable
//
// @Override
// public void run() {
// if (target != null) {
// target.run();//动态绑定(运行类型Tiger)
// }
// }
//
// public ThreadProxy(Runnable target) {
// this.target = target;
// }
//
// public void start() {
// start0();//这个方法时真正实现多线程方法
// }
//
// public void start0() {
// run();
// }
//}
class Dog implements Runnable { //通过实现Runnable接口,开发线程
int count = 0;
@Override
public void run() { //普通方法
while (true) {
System.out.println("汪汪叫.." + (++count) + Thread.currentThread().getName());
//休眠1秒
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (count == 10) {
break;
}
}
}
}