Java 使用new Thread和线程池的区别

简单来说,Java编程中使用newThread创建线程和线程池(比如Executors提供的四种类型)处理异步任务有很大的区别。
其实很简单。
使用 newThread 会带来性能损失、线程管理混乱以及缺乏高级功能等问题。
我们先来说说最重要的事情。
每次调用newThread时,都会实例化一个新的对象,这在创建大量线程时会导致明显的性能损失。
还有一点:缺乏统一控制会导致系统资源耗尽,甚至引发OutOfMemoryError。
还有一个更重要的细节。
newThread 不支持同步、周期性任务、线程中断等高级功能。

一开始我觉得newThread简单方便,后来发现它有很多局限性。
等等,还有一件事。
Executors类提供的四个线程池解决了这些问题。
例如newCachedThreadPool在高并发时复用线程,newFixedThreadPool限制最大并发线程数,newScheduledThreadPool支持定时任务,newSingleThreadExecutor保证任务的顺序执行。

ExecutorService 的每个调度和执行方法都有其自己的用途。
提交允许您获取结果并检查状态,而执行则直接执行任务。
Callable和Runnable的区别在于前者可以返回结果并抛出异常,而后者只能执行操作。
通过这些技术,开发人员可以更有效地管理线程资源。

我认为加入 Java 架构师小组是值得尝试的。
它有涵盖Java开发、高性能、分发等多个领域的专家建议,对完善技术体系有很大帮助。

什么是线程

嘿,你发布的线程概念非常彻底,但听起来有点教科书......我自己完成了编程,所以我可以告诉你一些真实的东西。

我们来谈谈多任务处理。
想一想。
2 02 3 年我会在上海举办一个电商活动,后端必须同时处理订单、发送消息和检查库存。
如果我使用单线程,我必须等待任务完成。
顾客都急着等,老板还得骂我。
那时,我们使用多线程。
通过将事物划分到不同的线程中,计算机可以同时处理多个事物,并且响应速度要快得多。

但是多线程也并非没有缺陷。
我以前在杭州做项目的时候就遇到过这种情况。
线程可以竞争资源,数据可以随机更改,系统最终可能崩溃。
最烦人的就是纠错。
如果一个线程出现问题,整个系统就会变得混乱,这是一件令人头疼的事情。
所以后来我们更频繁地使用纱线池。
比如,2 02 2 年我引进新员工的时候,我教他们搭建一些绳子,放到池子里。
需要的时候,他们可以取出来使用,不再需要的时候再放回去。
这样管理方便,资源可以利用,不会乱七八糟。

归根结底,线程如果用得好,可以提高效率,但如果用得不好,就会带来陷阱。
您到底想了解什么?让我详细地给你解释一下。

C#的 Task,Thread,ThreadPool 之间有什么异同

前台线程意味着主程序必须等待执行完成才能退出。
默认情况下,它们都是前台线程。
您可以修改代码使其成为后台线程。

对于后台线程来说,一旦主程序执行完毕,无论是否结束都会直接退出。
ThreadPool是典型的后台线程。

说真的,如果你打开一个新线程,即使不做任何事情,内存也必须支持大约1 MB。
真是浪费啊。

ThreadPool只是为了避免问题。
使用现成的,无需每次都打开。
一旦线程完成,它就会返回到池中并等待新的工作。
性能比直接开一个新线程要好很多。

但是ThreadPool和线程控制不是很好。
想要强制停止线程吗?没有现成的API,所以你必须自己编写代码。
例如,如果你发现一个线程被卡住了几秒钟,你需要想办法杀死它并释放内存。
这两件事我都做不到。

此外,ThreadPool使用全局队列。
当线程竞争资源时,性能会受到影响。
任务比较好,它不使用全局队列,而是使用本地队列。
线程之间对资源的竞争会少很多,性能自然会更好。

Task还提供了很多API,比如暂停、取消等,比ThreadPool更详细。