Java多线程
基本概念
线程 是操作系统能够调度的最小单位,他被包含再进程志宏,是进程中的实际运作单位
进程 进程是程序的基本执行实体
并发和并行
并发:在同一时刻,有多个指令在单个CPU上交替执行
并行 在同一时刻,有多个指令在多个CPU上同时执行
多线程的实现方式
继承Thread类的方式进行实现
直接创建Thread对象
实现Runnable接口的方式进行实现
1.自定义一个类实现Runnable接口
2.重写里面的run方法
3.创建自己类的对象(表示多线程要完成的任务)
4.创建一个Thread对象(创建线程对象)
利用Callable接口和Future接口方式实现
特点:可以获取到多线程的运行结果
1.创建一个类实现Callable接口
2.重写call(有返回值,表示多线程运行的结果)
3.创建实现了Callable接口的实例化对象(表示多线程要执行的任务)
4.创建实现了Future接口的实例化对象FutureTask的对象(用于管理多线程运行的结果)
5.创建一个Thread对象(创建线程对象)
常见的成员方法
static Thread currentThread()
返回对当前正在执行的线程对象的引用。
void setPriority(int newPriority)
更改线程的优先级。
static void sleep(long millis)
在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响
void start()
使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
void setName(String name)
改变线程名称,使之与参数 name 相同
void join()
等待该线程终止。 (插入线程)
static void yield()
暂停当前正在执行的线程对象,并执行其他线程(出让线程)
线程的生命周期
线程安全
synchronize锁
同步代码块 把操作共享数据的代码锁起来
//锁是默认打开的,有一个线程进去了,锁自动关闭
//里面的代码全部执行完毕,代码出来,锁自动打开
//锁对象一定要是唯一的,不然一个对象一个锁就失去了锁的意义(可以传递当前类字节码文件的对象 eg.MyThread.class ,保证某一对象的锁的唯一性)
synchronized(锁){
操作共享数据的代码
}
同步方法 就是把synchronized关键字加到方法上
//本质和同步代码块是一样的,就是锁住的是一个方法,但是锁的对象不能自己指定
//非静态时对象时this,静态的对象时当前类的字节码对象
权限修饰符 synchronized 返回值类型 方法名(方法参数){···}
lock锁
//相比synchronizd锁可以自己手动的上锁和手动的释放锁
//Lock是接口不能直接实例化,可以用他的实现类ReentrantLock来实例化
void lock()
获取锁
void unlock()
释放锁。
死锁
简单来说就是锁里套锁,在多线程执行过程中可能存在两个线程,一个线程进入了一个大锁,另一个线程进入了这个大锁中的一个小锁,此时进入大锁中的只能等待小锁解锁再进去,假如小锁中有大锁未解开的锁,此时就陷入了俩个线程一起等待,进入死锁