可知最后:无论哪种方法都需要实现run()方法,run方法是线程的运行主体。并且,线程的运行都是调用Thread的start()方法。
那么代理模式中Thread类就充当了代理类,它在线程运行主体运行前作了一些操作然后才运行线程的run()。首先说一下代理模式的基本特征就是对【代理目标进行增强】代理模式就不在这里详述。总之,Thread提供了很多有关线程运行前、后的操作,然后通过它的start()方法让JVM自动调用目标的run()方法
第四:继承Thread与实现Runnable接口方法区别
首先看一段代码:
可以预测一下这段代码是执行哪一个run()方法?
根据以前java中基础知识可知:执行start()方法后,JVM去找run()方法,然后它找到了自己的run()方法,那么就直接运行自己的run()方法。如果找不到自己的方法它才会去找被代理的run()方法。所以它应该执行的是"thread:。。。"代码部分。可以把它放到一个main方法中,通过测试验证推断正确:
想说明的是一个面向对象的思想:即如果没有上方第二个run()块,那么它执行的就是匿名Runnable实现类的run()方法。这说明什么,说明,Thread相当于一个执行者,而执行的代码块在Runnable实现类中定义好。这样实现执行与源码的分离,体现了面向对象的思想。这也是他们之间的一个比较大的区别。
其他区别:
实现Runnable接口可以实现资源共享,Thread无法完成资源共享 ----- 讨论第三点的两段代码中:继承Thread的:结果卖出了15张,各有各的票数。实现Runnable接口的方法:卖出5张,共享了资源
实现Runnable接口比继承Thread类来实现多线程有如下明显优点:
适合多个相同程序代码使用共同资源;
避免由单继承局限带来的影响;
增强程序的健壮性,代码能够被多个线程共享,代码数据是独立的;
使用的选择
通过比对区别可知:
由于面向对象的思想,以及资源共享,代码健壮性等,一般都是使用实现Runnable接口来实现多线程,也比较推荐
文章的主题是基于下面的旧版的一些线程池的讲解,再加上1.8的情况与一些补充,下面为旧版原文链接,基本思想没变,仅进行一些对比解释
在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:
如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。
那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?
在Java中可以通过线程池来达到这样的效果。今天我们就来详细讲解一下Java的线程池,首先我们从最核心的ThreadPoolExecutor类中的方法讲起,然后再讲述它的实现原理,接着给出了它的使用示例,最后讨论了一下如何合理配置线程池的大小。
以下是本文的目录大纲:
一.Java中的ThreadPoolExecutor类
二.深入剖析线程池实现原理
三.使用示例
四.如何合理配置线程池的大小
若有不正之处请多多谅解,并欢迎批评指正。
一.Java中的ThreadPoolExecutor类
java.uitl.concurrent.ThreadPoolExecutor类是线程池中最核心的一个类,因此如果要透彻地了解Java中的线程池,必须先了解这个类。下面我们来看一下ThreadPoolExecutor类的具体实现源码。
在ThreadPoolExecutor类中提供了四个构造方法:
public class ThreadPoolExecutor extends AbstractExecutorService {
..... public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue); public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory); public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue,RejectedExecutionHandler handler); public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler); ... }