资料内容:
第 01 讲:为何说只有 1 种实现线程的方法?
在本课时我们主要学习为什么说本质上只有一种实现线程的方式?
实现 Runnable 接口究竟比继承 Thread 类实现线程好在哪里?
实现线程是并发编程中基础中的基础,因为我们必须要先实现多线程,才可以继续后续的一
系列操作。所以本课时就先从并发编程的基础如何实现线程开始讲起,希望你能够夯实基础,
虽然实现线程看似简单、基础,但实际上却暗藏玄机。首先,我们来看下为什么说本质上实
现线程只有一种方式?
实现线程的方式到底有几种?大部分人会说有 2 种、3 种或是 4 种,很少有人会说有 1
种。我们接下来看看它们具体指什么?2 种实现方式的描述是最基本的,也是最为大家熟知
的,我们就先来看看 2 种线程实现方式的源码。
实现 Runnable 接口
public class RunnableThread implements Runnable {
@Override
public void run() {
System.out.println('用实现 Runnable 接口实现线程');
}
}
第 1 种 方 式 是 通 过 实 现 Runnable 接 口 实 现 多 线 程 , 如 代 码 所 示 , 首 先 通 过
RunnableThread 类实现 Runnable 接口,然后重写 run() 方法,之后只需要把这个实现了
run() 方法的实例传到 Thread 类中就可以实现多线程。
继承 Thread 类
public class ExtendsThread extends Thread {
@Override
public void run() {
System.out.println('用 Thread 类实现线程');
}
}
第 2 种方式是继承 Thread 类,如代码所示,与第 1 种方式不同的是它没有实现接口,而
是继承 Thread 类,并重写了其中的 run() 方法。相信上面这两种方式你一定非常熟悉,并
且经常在工作中使用它们。
线程池创建线程那么为什么说还有第 3 种或第 4 种方式呢?我们先来看看第 3 种方式:通过线程池创建
线程。线程池确实实现了多线程,比如我们给线程池的线程数量设置成 10,那么就会有 10
个子线程来为我们工作,接下来,我们深入解析线程池中的源码,来看看线程池是怎么实现
线程的?
线程工厂:就是给线程设置一些相关属性的,例如线程优先级,名称,是否是守护线程等
static class DefaultThreadFactory implements ThreadFactory {
DefaultThreadFactory() {
SecurityManager s = System.getSecurityManager();
group = (s != null) ? s.getThreadGroup() :
Thread.currentThread().getThreadGroup();
namePrefix = "pool-" +
poolNumber.getAndIncrement() +
"-thread-";
}
public Thread newThread(Runnable r) {
Thread t = new Thread(group, r,
namePrefix + threadNumber.getAndIncrement(),
0);
if (t.isDaemon())
t.setDaemon(false);
if (t.getPriority() != Thread.NORM_PRIORITY)
t.setPriority(Thread.NORM_PRIORITY);
return t;
}
}