一.进程和线
进程:应用程序的执行实例。 有独立的内存空间和系统资源
线程:CPU调度和分派的基本单位。进程中执行运算的最小单位,可完成一个独立的顺序控制流程
程
多线程
如果在一个进程中同时运行多个线程,用来完成不同的工作,则称之为“多线程”
并发执行
通常表示同一个时刻有多条指令代码在处理器上同时运行
往往需要多个处理器支持
并发运行
表示在一个处理器中,操作系统为了提高程序的运行效率,将CPU的执行时间分成多个时间片,分配给同一进程的不同线程
多个线 程分享CPU时间,交替执行
主线程
Java程序启动时,一个线程立即随之启动,通常称之为程序的主线程
2线程创建与启动
两种创建线程的两种方式
继承java.lang.Thread类
实现java.lang.Runnable类
实现线程步骤
定义线程----->创建线程对象------>启动线程
继承Thread类创建线程
自定义线程类继承自Thread类
重写run()方法,编写线程执行体
创建线程对象,调佣start()方法启动线程
Thread类的run()是线程运行的起点
线程休眠
3实现Runnable接口创建线程
Runnable接口位于java.lang包
只提供一个抽象方法run()的声明
实现步骤
1.定义MyRunnable类实现Runable接口
2.实现run()方法,编写线程执行体
3.创建线程对象,调用Start()方法启动线程
比较两种创建线程的方式
继承Thread类
1.编写简单,可直接操作线程
2.使用于单继承
实现Runnable接口
避免单继承局限性
便于共享资源
4状态
通常,线程的生命周期有五种状态
阻塞状态,运行状态死亡状态
就绪状态,创建状态
线程运行完毕
有比当前线程优先级更高的线程抢占了CPU
线程休眠
线程因等待某个资源而处于堵塞状态
指按照特定机制为多个线程分配CPU的使用权
每个线程执行都具有一定的优先级
常用的线程操作方法
join()方法的重载方法
millis:以毫秒为单位的等待时长
nanos: 要等待的附加纳秒时长
暂停当前线程,允许其他具有相同的优先级的线程获得运行机会
该线程处于就绪状态,不转为阻塞状态
yield()方法定义
共同点
Thread类的静态方法
会使当前处于运行状态的线程放弃CPU使用权,将运行机会让给其他线程
不同点
sleep()方法会给其他线程运行机会,不考虑其他线程的优先级因此较低优先级线程可能会获得运行机会
yield()方法只会将运行机会让给相同优先级或者更高级的线程
调用sleep()方法需要处理lnterruptedException异常,而调用yield()方法无此要求
线程同步的特征
不同的线程在执行以同一个对象作为锁定标记的同步代码块或者同步方法时,因为要获得这个对象的锁而互相牵制
多个并发线程访问同一资源代码块或同步方法时
同一时刻只能有一个线程进入synchronized(this)同步代码块
当一个线程访问一个synchronized(this)同步代码块时,其他线程可以访问该资源的非synchronized(this)同步代码
如果多个线程访问的不是同一共享资源,无法同步