几乎所有的操作系统都支持进程的概念,所有运行中的任务通常对应一个进程(Process)。当一个程序 进入内存运行时,即变成一个进程。进程是处于运行过程中的程序,并且具有一定的独立功能,进程是 系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。
1独立性:进程是系统中独立存在的实体,它可以拥有自己独立的资源,每一个进程都拥有自己私有 的地址空间。在没有经过进程本身允许的情况下,一个用户进程不可以直接访问其他进程的地址空 间。
2动态性:进程与程序的区别在于,程序只是一个静态的指令集合,而进程是一个正在系统中活动的 指令集合。在进程中加入了时间的概念。进程具有自己的生命周期和各种不同的状态,这些概念在 程序中都是不具备的。
3并发性:多个进程可以在单个处理器上并发执行,多个进程之间不会互相影响。
大部分操作系统都支持并发性,现在的系统几乎都支持同时运行多个任务
Java线程的实现
1Java语言提供两种实现的方法
2继承Thread类创建线程类 实现Runnable接口创建线程类
1Java语言提供两种实现的方法
①定义类继承Thread类,并重写Thread类的run()方法,该run()方法的方法体就代表了线程需要完 成的任务。因此把run()方法称为线程执行体。 ②创建Thread子类的实例,即创建了线程对象。 ③调用线程对象的start()方法来启动该线程。
2继承Thread类创建线程类 实现Runnable接口创建线程类
线程的五种状态
(1) 新建状态(New):线程对象实例化后就进入了新建状态
(2) 就绪状态(Runnable):线程对象实例化后,其他线程调用了该对象的start()方法,虚拟机便 会启动该线程,处于就绪状态的线程随时可能被调度执行
(3) 运行状态(Running):线程获得了时间片,开始执行。只能从就绪状态进入运行状态
(4) 阻塞状态(Blocked):线程因为某个原因暂停执行,并让出CPU的使用权后便进入了阻塞状 态。 等待阻塞:调用运行线程的wait()方法,虚拟机会把该线程放入等待池。 同步阻塞:运行线程获取对象的同步锁时,该锁已被其他线程获得,虚拟机会把该线程放入锁 定池。 其他线程:调用运行线程的sleep()方法或join()方法,或线程发出I/O请求时,进入阻塞状态
(5)结束状态(Dead):线程正常执行完或异常退出时,进入了结束状态
线程同步
许多在单线程情况下的代码放到多线程环境下容易出现线程安全问题
为了解决线程安全问题java使用同步监视器的通过方法就是同步代码块
synchronized (obj) {
//同步代码块
单线程与多线程的区别
1、多线程间并行,是一个进程中的多个执行流,可理解为将一个大任务拆分出的多个子任务。
2、多线程适用场景
1)存在需要等待IO、网络或其他外部资源的任务。当前等待其他资源却依旧占用CPU的线程可让出CPU,让其他线程执行,大大提高了程序效率,充分利用了CPU资源。
2)存在长时间占用CPU的任务。CPU以时间片为单位分配给各个线程,一个周期内各个线程都可以得到执行,而非卡在一个线程。而且多线程意味着分配到的CPU时间片也更多。
3、多线程弊端
1)访问共享资源时要小心,需要更多的锁资源,同步更加复杂。
2)内存占用更多,资源开销更大。
3)需要额外的线程调度和管理。如需要CPU时间来跟踪线程。