代理模式的特点:
在Java多线程中的实现中使用了代理模式。当我们需要开启多线程执行某一项任务时,需要创建一个我们自己定义的被代理类,比如DoWork,它继承自Runnable,并重写run()抽象方法,也就是真实角色所要实现的业务逻辑。系统提供的类Thread也继承自Runnable,同样也实现了run()抽象方法,把DoWork的对象doWork当作参数传入Thread的构造方法中,这时候在Thread实现的run()当中去调用doWork的run()方法,从而实现代理。
一般来说,代理模式都是在代理类(Thread)所实现的抽象方法(run())中去调用被代理类(DoWork)已经实现好的抽象方法(run()),如下图,target就是DoWork的实例。但Thread的对象thread如果直接执行run()方法,会把 run 方法当成一个 main 线程下的普通方法去执行,并不会开启另外一个线程中执行,还是在主线程里执行,所以这并不是多线程工作。
public class Thread implements Runnable {
// 忽略其他方法......
private Runnable target;
@Override
public void run() {
if (target != null) {
target.run();
}
}
}
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
而thread调用start()方法,可启动线程并使线程进入就绪状态,当分配到时间片后就可以开始运行了。 start() 会执行线程的相应准备工作,然后自动执行thread的run()方法的内容,这是真正的多线程工作。
本文地址:https://blog.csdn.net/lcd493357984/article/details/107419305
如对本文有疑问, 点击进行留言回复!!
Flink程序JDK8 运行一段时间后NullException解决
解决: java.lang.NoClassDefFoundError: org/apache/http/client/HttpClient
SpringBoot中定制异常页面(404页面配置提高用户体验)
DataGrip和IDEA无法连接上Mysql问题解决方法详解
Java基础语法(多态、类、接口、Date类、基本类型、系统类)
网友评论