- 程序:Program,是一个指令的集合。
- 进程:Process,正在执行中的程序,是一个静态概念。
- 进程是程序的一次静态执行过程,占用特定的地址空间。
- 每个进程都是独立的,由CPU,data,code三部分组成。
- 缺点:浪费内存,cpu的负担
- 线程:是进程执行中的一个“单一的连续控制流程”(a single Thread, equential flow of control)/执行路径。
- 线程又被称为轻量级进程(lightweight process)
- 一个进程可拥有多个并行(concurrent)的线程。
- 一个进程中的线程共享相同的内存单元/内存地址空间,意味着,它们可以访问相同的变量和对象,而且它们从同一堆中分配对象,所以需要通信、数据交换、同步操作等。
- 由于线程间的通信是在同一地址空间上进行的,所以不需要额外的通信机制,这就使得通信更简便,而且信息传递的速度也更快。
- 实现多线程的时候:
- 方法一:继承Thread类,调用其start()方法。
- 方法二:实现Runnable接口,重写run()方法,创建参数为实现Runnable接口的对象的Thread对象,调用其start()方法。这种方式避免了单继承,方便共享资源,同一份资源多个代理访问
- 这种实现方式使用了设计模式中的代理模式。
- 必须要重写run方法,run方法中是核心的执行逻辑
- 线程在启动的时候,要通过start()方法进行调用。直接调用run()方法的效果是将run方法当作普通方法来执行,而不是线程方法。
- 每次运行相同的代码,线程执行的顺序不一定一致,原因是多线程之间谁先抢占资源无法进行人为控制。
- 方法三:使用显式锁Lock类中的lock()和unlock()方法对需要异步的代码进行主动加锁和解锁。
- 线程的状态(5种):创建、就绪状态、运行状态、阻塞状态、终止
- 线程的声明周期:
- 新生状态:创建好当前线程对象,没有启动之前(调用start方法前)
- 就绪状态:当对应的线程创建完成,并调用start()方法后,所有的线程会添加到一个就绪队列中,所有的线程准备同时去抢占CPU的资源。
- 运行状态:当前进程获取到cpu资源后,就绪队列中的所有线程会去抢占cpu的抢占到资源的线程限制性,在执行的过程中就叫运行状态。
- 死亡状态:运行中的线程正常执行完所有的代码逻辑或者因为异常情况导致程序结束。
- 进入死亡状态的方式:
- 正常运行完成且结束
- 线程被强制性终止,如stop()方法(已过时,不推荐使用的终止方式)
- 线程抛出未捕获的异常。
- 进入死亡状态的方式:
- 阻塞状态:程序运行过程中,发生某些异常情况,导致当前线程无法再顺利执行下去,此时会进入阻塞状态。进入阻塞状态的原因消除后,所有的阻塞队列再次进入到就绪状态中,再次等待执行。
- 进入阻塞状态的方式:
- sleep()方法
- 等待io资源
- join()方法
- 进入阻塞状态的方式:
- 线程操作的相关方法:
- currentThread():Thread类的静态方法,返回当前正在执行的线程对象
- join():调用该方法的线程将被强制执行,令其它线程处于阻塞状态,当该线程执行完毕后,其它线程再执行。
- sleep(long millis):使当前正在执行的线程休眠millis秒,该线程处于阻塞状态。
- yield():当前正在执行的线程暂停一次,允许其它线程执行,而当前线程不进入阻塞状态,进入就绪状态;如果没有其它等待执行的线程,那么当前线程就会恢复执行。
- 在使用多线程的时候可以实现唤醒(notify()方法)和等待(wait()方法)的过程,但是唤醒和等待操作的对象不是thread,而是我们设置的共享对象或者变量,即线程调用的资源。
【Java基础】多线程学习笔记(1)基础
最新推荐文章于 2024-07-14 14:59:27 发布