了解如何在Java中创建线程池以及如何重用线程

286 阅读3分钟

了解线程池以及如何从头开始在Java中创建线程池。这篇文章包括简单线程池版本的介绍、实现和测试。

了解如何在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线程池,而是尝试创建自己的线程池。

无法更改线程的可运行性

现有线程设计不允许您要更改指令(可运行内容)。因此,所有可用的设置者是:

了解如何在Java中创建线程池以及如何重用线程

在提供的策划者中没有setRunnable。那么Java的线程池是如何工作的呢?

您可以在当前线程中运行另一个可运行的线程

Java允许在当前线程中运行其他Runnable。因此,要动态地“更改”Runnable,我们可以在一个线程的循环中运行Runnable。让我们只创建一个工人(线) 将执行其他可运行的(任务) 在无穷大循环中:

了解如何在Java中创建线程池以及如何重用线程

线程在不调用新线程的情况下在内部执行Runnable

正如您在前面的代码中所看到的,当主线程获得newTaskBeExecuted时,它使用run()方法而不是start()方法。这样做并不会调用新线程,而是在内部执行。为了再次检查是否使用其他线程,我们打印当前线程名,并确认只使用一个线程。

使用创建的线程池

现在有了我们自己的线程池,我们就可以满足我们的任务(Runnables)。一旦主工作人员(只有一个线程)可用,它将运行:

了解如何在Java中创建线程池以及如何重用线程

在执行之后,我们可以看到在一个主工作线程中已经执行了不同的Runnable。这证明我们的线程池正如我们所期望的那样工作。

结语

在本文中,我们回顾了线程池模式的核心思想,并实现了一个过于简化的版本。我们的示例不适合生产,但它解释了真正的线程池是如何工作的

最后

更多Java进阶学习资料、2022大厂面试真题,完整资料已经给大家打包完毕,需要资料的小伙伴可以点击获取学习资料 了解如何在Java中创建线程池以及如何重用线程