关于Java中线程、Runnable和线程池概念的最重要的信息,带有清晰的例子、信息图表和解释。
多线程是Java中最复杂也是最大的部分
多线程章节是Java中最难理解和使用的。不幸的是,没有那么多的来源可以让你得到所有的答案。同时,并发知识非常重要。在本文中,我解释了每个Java开发人员都必须知道的多线程的核心方面。在这一部分,我们从线程和Runnable主题开始。
为什么并发知识如此关键?
没有好的多线程知识,你不可能得到高级Java工作
多线程知识几乎肯定是高级Java职位面试的主题。无论有没有实践经验,如果没有对多线程的清晰理解,您很可能会失败。
几乎每个生产应用程序都使用多线程范例
在实际项目中,您将使用应用服务器或它们的替代品。所有这些都基于多线程解决方案,如线程池等。任何适当的实现都需要并发一致性。
线程和可运行的定义
多线程是基于线程和可运行的。Thread是一个启动新的独立活动并执行Runnable提供的指令的类。
线程是一个附属于操作系统的实体,这就是为什么它是一个很重的类。同时,Runnable只是一组指令——这就是它轻量级的原因。
如何执行新线程
线程可以通过使用Run()方法。为了在新的活动中运行指令,Thread提供了Start()方法。
(new Thread()).run(); // run in current thread
(new Thread()).start(); // run in new thread
如何重用线程
线程可以在其内部执行许多runnables。这里有一篇更详细的文章。在这里,您可以看到一个非常简短的示例,其中许多runnables(任务)在一个线程中运行:
List<Runnable> tasks = new ArrayList<Runnable>();
(new Thread(() -> {
for (Runnable task : tasks) {
task.run();
}
})).start();
如何停止线程
你不能就这样stop()或者suspend()线程。这些方法已被否决。你必须注意使用中断设计isAlive()或者isInterrupted()
(new Thread(() -> {
while(true){
// process a peace of logic
if(Thread.currentThread().isInterrupted()){
//handle exiting
break;
}
}
})).start();
线程守护程序
线程可以是守护进程。守护线程会立即中断,即使最后一部分不会被执行。所以这样的线程可以附加到资源上。否则,它们可能是资源或/和内存泄漏的原因。
Thread thread = (new Thread(() -> {
try {
// working with resource
} finally {
// resource.close(); - might won't work because finally if
// deamon been interrupted
}
}));
thread.setDaemon(true);
thread.start();
如何使用线程池
只要线程实例很重,使用ThreadPool类重用同一个线程是有意义的。根据您的线程,您可以使用不同的线程池实现。
固定线程池
FixedThreadPool是一个简单的池,具有预定义数量的线程。期间线程数不会改变。使用它是有意义的:
缓存线程池
与固定线程池相反,这种池可以在增加更多任务时动态增加线程数量。每个新创建的线程在使用时都是活动的,否则在空闲60秒后就会被删除。
如何定义线程池中的线程数量
为了将最佳线程池用于您的应用程序,您需要了解以下事项:
- 如果你的线程做大量的计算,比如视频渲染,加密等等。,那么它会吃掉运行该线程的进程。
- 如果您的线程运行与CPU活动无关,如网络调用、内存调用等。,那么它就不会消耗运行它线程的CPU。
根据这些知识,你可能会得出以下结论:
- 具有高CPU消耗的任务不要分配比CPU核心更多的线程
- 在低CPU消耗任务中,线程数量可以多于CPU内核数量(但比例取决于具体情况)。
结论
本文只强调了线程、可运行线程和线程池概念的主要内容,但并没有涵盖全部内容。仍有许多方面可能发挥重要作用。
感谢阅读,点赞收藏+关注!资料已经给大家整理好了,更多的java课程学习路线,笔记,面试等架构资料,想要学习的同学可以私信作者“学习”