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

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

创建和运行线程

线程创建是一个众所周知的过程,有两种创建方式:

  • 扩展线程并重写run方法
  • 线程构造器的Feed 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方法在当前运行的线程中执行指令。
  • Start方法在一个新的单独线程中执行指令。

让我们来描述这两种情况:

线程池:重用现有线程以节省内存

线程池模式代表重用现有线程和运行所有新指令,而不分配新线程。线程池控制运行线程的数量,并广泛用于生产中。

这种模式在Java中有实现:

  • executors . newscheduledthreadpool(THREAD _ POOL _ NUMBER)
  • Executors.newCachedThreadPool()

这里,我们不会研究现有的Java线程池,而是尝试创建我们自己的线程池。

无法更改线程的Runnable

现有螺纹设计不允许您要更改指令(可运行的内容)。因此,所有可用的setters都是:

在提供的setters中没有setRunnable。那Java的线程池是怎么工作的呢?

你可以在当前线程中运行另一个Runnable

Java允许在当前线程中运行其他可运行程序。因此,为了动态地“改变”runnables,我们可以在一个线程的循环中运行runnables。让我们只创建一个工作线程这将执行其他可运行的(任务) 在无限循环内部:

线程在内部执行Runnable而不调用新线程

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

使用创建的线程池

现在有了我们自己的线程池,我们可以喂我们的任务(Runnables)。一旦主工作线程(唯一的一个线程)变得可用,它将运行:

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

结论

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

最后

机会是留给有准备的人的,点赞+收藏,更多的java课程学习路线,笔记,等架构资料,想要学习的朋友关注博主+私信“学习”可获得免费资料!!

2 (6).jpeg

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享