了解线程池以及如何用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课程学习路线,笔记,等架构资料,想要学习的朋友关注博主+私信“学习”可获得免费资料!!