多线程
过程
概念
就是正在运行的程序。也就是代表了程序所占用的内存区域。
特点
l 独立性 :过程是零碎中独立存在的实体,它能够领有本人的独立的资源,每一个过程都领有本人公有的地址空间。在没有通过过程自身容许的状况下,一个用户过程不能够间接拜访其余过程的地址空间。
l 动态性 :过程与程序的区别在于,程序只是一个动态的指令汇合,而过程是一个正在零碎中流动的指令汇合。在过程中退出了工夫的概念,过程具备本人的生命周期和各种不同的状态,这些概念在程序中都是不具备的。
l 并发性 :多个过程能够在单个处理器上并发执行,多个过程之间不会相互影响。
线程
概念
线程(thread)是操作系统可能进行运算调度的最小单位。它被蕴含在过程之中,是过程中的理论运作单位。一个过程能够开启多个线程。
多线程扩大了多过程的概念,使得同一个过程能够同时并发解决多个工作。
一个程序运行后至多一个过程,一个过程里蕴含多个线程。
如果一个过程只有一个线程,这种程序被称为单线程。
如果一个过程中有多条执行门路被称为多线程程序。
过程和线程的关系
一个操作系统中能够有多个过程,一个过程中能够有多个线程,每个过程有本人独立的内存,每个线程共享一个过程中的内存,每个线程又有本人独立的内存。
多线程的个性
随机性
并发: 多个软件同时抢共享资源
高并发: 很多个软件在同时抢占共享资源
并行: 多个 cpu 同时在执行,而且每个 cpu 只干一个活
线程状态
线程生命周期,总共有五种状态:
1) 新建状态(New):当线程对象对创立后,即进入了新建状态,如:Thread t = new MyThread();
2) 就绪状态(Runnable):当调用线程对象的 start() 办法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是阐明此线程曾经做好了筹备,随时期待 CPU 调度执行,并不是说执行了 t.start() 此线程立刻就会执行;
3) 运行状态(Running):当 CPU 开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。注:就绪状态是进入到运行状态的惟一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中;
4) 阻塞状态(Blocked):处于运行状态中的线程因为某种原因,临时放弃对 CPU 的使用权,进行执行,此时进入阻塞状态,直到其进入到就绪状态,才有机会再次被 CPU 调用以进入到运行状态;
5) 依据阻塞产生的起因不同,阻塞状态又能够分为三种:
a) 期待阻塞:运行状态中的线程执行 wait() 办法,使本线程进入到期待阻塞状态;
b) 同步阻塞:线程在获取 synchronized 同步锁失败 (因为锁被其它线程所占用),它会进入同步阻塞状态;
c) 其余阻塞:通过调用线程的 sleep() 或 join() 或收回了 I / O 申请时,线程会进入到阻塞状态。当 sleep() 状态超时、join() 期待线程终止或者超时、或者 I / O 处理完毕时,线程从新转入就绪状态。
6) 死亡状态(Dead):线程执行完了或者因异样退出了 run() 办法,该线程完结生命周期。
多线程创立:继承 Thread
概述
Thread 类实质上是实现了 Runnable 接口的一个实例,代表一个线程的实例。启动线程的惟一办法就是通过 Thread 类的 start() 实例办法。Start() 办法是一个 native 办法,它将告诉底层操作系统,最终由操作系统启动一个新线程,操作系统将执行 run() 办法。这种形式实现多线程很简略,通过本人的类间接 extend Thread,并复写 run() 办法,就能够启动新线程并执行本人定义的 run() 办法。
线程的业务必须写在重写的 run() 里
创立线程的形式一共有两种: 继承 Thread 和实现 Runnable 接口
多线程创立:实现 Runnable 接口
实现 Runnable 接口的这种形式,只能通过 Thread 类里的含参构造方法来实现对象的创立。
同步锁
概述
同步: 即当有一个线程在对内存进行操作时,其余线程都不能够对这个内存地址进行操作,直到该线程实现操作,其余线程能力对该内存地址进行操作,而其余线程又处于期待状态,在效率上,同步比异步的效率低,是就义了效率进步了平安。
异步: 是指线程不期待,同时去抢占共享资源,在效率上,异步比同步的效率高,是就义了平安进步了效率。
锁: 把程序中的共享资源加锁
把有可能呈现问题的代码包起来,一次只让一个线程执行。通过 sychronized 关键字实现同步。
当多个对象操作共享数据时,能够应用同步锁解决线程平安问题。
synchronized 关键字
同步锁的实现形式: 在代码块上加锁
语法:
synchronized(锁对象){须要同步的代码;}
锁对象: 如果锁的是一般的资源,能够任意,然而必须是同一个对象。如果锁的是动态资源,锁对象必须是类名.class,因为动态资源是随着类的加载而加载。
同步锁的实现形式: 在办法上加锁
给一般办法调配的锁对象是 this
给静态方法调配的锁对象是类名.class
语法:
synchronized public void 办法名 (参数列表){办法体}
特点
1、前提 1,同步须要两个或者两个以上的线程。
2、前提 2,多个线程间必须应用同一个锁。
3、同步的毛病是会升高程序的执行效率,为了保障线程平安, 必须就义性能。
4、能够润饰办法称为同步办法,应用的锁对象是 this。
5、能够润饰代码块称为同步代码块,锁对象能够任意。