JAVA 并发编程
最初计算机是单任务的,然后发展到多任务,接着出现多线程并行,同时计算机也从单cpu进入到多cpu。如下图:
多任务:其实就是利用操作系统时间片轮转使用的原理。操作系统通过将cpu的执行时间分割成多个时间片,为每个任务分配时间片,因为cpu处理速度很快,这样就用户看来好像每个任务都在同时执行,感觉有多个cpu,但本质上一个时间点只有一个任务在运行。
随着多核多线程的出现,我们可以更好的利用资源但是同时也面临着更多的多线程编程挑战。
并行编程的好处:
1)提高资源利用率,提升程序运行时间---cpu的就是利用率
2)提高程序响应速度,比如用户界面的点击按钮,就是使用多线程,服务器收到用户点击请求,将这个请求交于一个新线程(worker)去执行,这样服务器就可以继续等待用户的输入请求,否则服务器在处理上一个请求的时候是无法响应当前用户的请求的。
并行编程的代价和挑战:
1)增加内存的消耗。
2)上下文的切换会消耗额外内存,从一个线程切换到另一个线程,需要记录当前线程的数据变量,指针等,然后执行另一个线程。
3)内存数据的同步,锁,通信等问题。
线程池(ThreadPool):
我想大部分人在听到这个东西的时候会感觉很神奇,但其实ThreadPool特别简单。线程池就是我们通过人工或者手动设置内存当中线程数的数量,使得程序可以最优运行。简单理解就是这样:我们设置一个线程池的大小,比如线程池的数量为10,那么当有线程任务来临的时候我们就使用线程池的线程去执行这个任务,如果线程池的10个线程都在执行任务,就把这个任务加到等待队列,等候其他线程运行结束后再执行。
使用线程池的好处:
1)降低资源消耗,通过重复利用在线程池中已创建好的线程执行任务,减少创建、销毁线程的内存和时间开销。
2)响应速度快,因为直接使用已创建好的线程执行任务,而不是去创建线程,所以响应时间快。
3)可以更好的管理线程,因为线程是稀有资源,避免随意创建线程(一个线程