Thread-1

3. 前序:文件和线程是比较重要的章节,我会下更多的时间去研究,主要还是从源码出发,了解内部实现机制及使用场景,包括使用中遇到的问题。Thread/JUC包(Atomic、Lock、Thread、AQS、CyclicBarrier、Semaphore、CountDownLatch)

    Thread 

线程的状态  

Blocked

      start()  -> Runnable     Running  -> run()

Blocked in Blocked in 

Object’s Lock Pool Object’s Wait Pool

其中Running表示运行状态,Runnable表示就绪状态(yield),Blocked表示阻塞状态,阻塞状态又有多种情况,可能是因为调用wait()方法进入等待池,也可能是执行同步方法或同步代码块进入等锁池,或者是调用了sleep()方法或join()方法等待休眠或其他线程结束,或是因为发生了I/O中断

线程的实现方式 

说线程就会提到进程,那进程和线程的区别是什么?最本质的区别?

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是操作系统进行资源分配和调度的一个独立单位;

线程是进程的一个实体,是CPU调度和分派的基本单位,是比进程更小的能独立运行的基本单位。

线程的划分尺度小于进程,这使得多线程程序的并发性高;进程在执行时通常拥有独立的内存单元,而线程之间可以共享内存。

使用多线程的编程通常能够带来更好的性能和用户体验,但是多线程的程序对于其他程序是不友好的,因为它可能占用了更多的CPU资源。

进程间的通信方式

无名管道:半双工  数据单向 只能在父子进程间通信

有名管道:允许无父子关系的进程通信

高级管道:将另一个程序当作新的进程在当前进程中启动,算当前进程的子进程

消息队列:消息的链表 存放在内核中并由消息队列标识符标识,克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限制的缺点。

信号量:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。作为一种锁的机制,防止进程正在访问的共享资源,其他进程也在访问,作为进程间以及同一进程内不同线程之间的同步手段

信号:信号用于通知接收进程某个事件已经发生。例如NIO 接受 读写 事件

共享内存通信:共享内存是映射一块被其他进程所访问的内存,这段内存由一个进程创建,其他进程都可以访问,是最快的IPC方式,是针对其他进程间通信方式运行效率低而专门设计的,与信号量 配合使用,来实现进程间的同步和通信

套接字通信:通过网络实现不同机器间的进程通信。


线程间的通信方式

共享变量 定义全局变量 

队列 消费者和生产者的模式来实现通信

线程池:

在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁,这就是”池化资源”技术产生的原因。

ThreadPoolExecutor

Executor  接口定义一个执行线程的工具 它的子类型即线程池接口是ExecutorService

Executors  提供了一些静态工厂方法,生成一些常用的线程池

newSingleThreadExecutor:创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。

newFixedThreadPool:创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程

newCachedThreadPool:创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。

newScheduledThreadPool:创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。

newSingleThreadScheduledExecutor:创建一个单线程的线程池。此线程池支持定时以及周期性执行任务的需求


ExecutorService  父类是Executor,是Executor接口的增强,shutdown ,submit·1,Executors工具类中创建线程池返回的类型。

评论已关闭。