理解多线程和线程切换
多线程同时执行可以充分利用 CPU 的多核多线程功能来显著提高应用程序的性能,在多核环境中表现的更加明显(目前市面主流 CPU都是几乎都是多核多线程),即使单核 CPU 也支持多线程。
线程是操作系统调度的最小单元,CPU 通过给每个线程分配 CPU 时间片来实现多线程执行,时间片非常短(一般几十毫秒),通过不停切换线程来执行,给人的感觉是同时执行的。
多线程同时执行可以充分利用 CPU 的多核多线程功能来显著提高应用程序的性能,在多核环境中表现的更加明显(目前市面主流 CPU都是几乎都是多核多线程),即使单核 CPU 也支持多线程。
线程是操作系统调度的最小单元,CPU 通过给每个线程分配 CPU 时间片来实现多线程执行,时间片非常短(一般几十毫秒),通过不停切换线程来执行,给人的感觉是同时执行的。
Java 的线程即是工作单元,也是执行机制。从 JDK 5 开始,把工作单元与执行机制分离开来。工作单元包括 Runnable 和 Callable,而执行机制由 Executor 框架提供。
Executor 提供了一种将任务提交与每个任务如何运行的机制分离的方法(包括线程使用,调度的详细信息)。
Java 应用中对宝贵的稀缺资源池化是保障系统稳定运行,优化系统响应速度的重要手段。
线程池的运用场景非常广,几乎所有需要异步或并发执行任务的程序都可以使用线程池。
可以给线程指定异常处理类来捕获异常进行自定义处理。
线程中的异常可通过线程组异常处理来实现异常传递,线程组 ThreadGroup 实现了 Thread.UncaughtExceptionHandler 接口。
在将某一任务拆份成多个子任务,使用多线程执行这些子任,就涉及到线程通信,才能使用多子任变成一个整体。
线程间通信后,系统之间的交互性会更强大,在提高 CPU 利用率时还有助于对各线程任务的把控和监督。
JDK 自带的线程类实现了 Runnable 接口,提供了很多方法来支持对线程的操作,可以获取线程ID,线程名,判断线程是否存活等。
JDK 中已提供了对多线程的支持,可以很方便 实现多线程编程,主要有两种方式:一种是继承 Thread 类,另一种是实现 Runnable 接口。
一个 Web
项目的Socket
需用到多线程,每一个连接创建一条线程来处理数据。
在多线程中需要用到 Spring
中的 Bean
,如果直接用 Spring 注入是会报NullPointerException
错误。原因是线程类无法提前委托给Spring
管理,是在使用中创建的。
什么是线程安全?什么是非线程安全,该如何定义和理解?什么场景会出现非线程安全?这几个问题在脑子里有个概念和轮廓,但要描述清楚始终不得,不全,非一两个例子代码。