了解线程池以及如何从头开始在Java中创建线程池。这篇文章包括简单线程池版本的介绍、实现和测试。
创建和运行线程
线程创建是一个众所周知的过程,有两种方法可以创建它:
- 扩展线程并重写Run方法
- 将Runnable提供给线程构造函数
让我们实现这两个选项:
public static void main(String[] args) throws Exception {
// Thread from runnable
Thread thread = new Thread(() -> System.out.println("hey from runnable"));
// Thead from extened thread class
Thread myThread = new MyThread();
}
static class MyThread extends Thread {
@Override
public void run() {
System.out.println("hey from thread extended class");
}
}
\
启动方法和运行方法之间的差异
每个线程提供了两个启动其活动的方法,但有一个显著的区别:
- Run方法在当前运行的线程中执行指令。
- 方法在一个新的单独线程中执行指令。
让我们来描述这两种情况:
线程池:重用现有线程以节省内存
线程池模式表示重用现有线程并运行所有新指令而不分配新线程。线程池控制正在运行的线程数,并在生产中广泛使用。
此模式有Java实现:
- Executors.newScheduledThreadPool(THREAD_POOL_NUMBER)
- Executors.newCachedThreadPool()
在这里,我们将不研究存在的Java线程池,而是尝试创建自己的线程池。
无法更改线程的可运行性
现有线程设计不允许您要更改指令(可运行内容)。因此,所有可用的设置者是:
在提供的策划者中没有setRunnable。那么Java的线程池是如何工作的呢?
您可以在当前线程中运行另一个可运行的线程
Java允许在当前线程中运行其他Runnable。因此,要动态地“更改”Runnable,我们可以在一个线程的循环中运行Runnable。让我们只创建一个工人(线) 将执行其他可运行的(任务) 在无穷大循环中:
线程在不调用新线程的情况下在内部执行Runnable
正如您在前面的代码中所看到的,当主线程获得newTaskBeExecuted时,它使用run()方法而不是start()方法。这样做并不会调用新线程,而是在内部执行。为了再次检查是否使用其他线程,我们打印当前线程名,并确认只使用一个线程。
使用创建的线程池
现在有了我们自己的线程池,我们就可以满足我们的任务(Runnables)。一旦主工作人员(只有一个线程)可用,它将运行:
在执行之后,我们可以看到在一个主工作线程中已经执行了不同的Runnable。这证明我们的线程池正如我们所期望的那样工作。
结语
在本文中,我们回顾了线程池模式的核心思想,并实现了一个过于简化的版本。我们的示例不适合生产,但它解释了真正的线程池是如何工作的
最后
更多Java进阶学习资料、2022大厂面试真题,完整资料已经给大家打包完毕,需要资料的小伙伴可以点击获取学习资料!