多线程的两个概念:
并发:同一时刻,有多个指令在单个CPU上交替执行
并行:在同一时刻,有多个指令在多个CPU上同时执行
多线程的实现方式:
1.继承Thread类的方式进行实现
1、自己定义一个类继承Thread
2、重写run方法
3、创建子类的对象,并启动线程(调用start方法)
2.实现Runnable接口的方式进行实现
1、自己定义一个类实现Runnable接口
2、重写里面的run方法
3、创建自己的类的对象(该对象表示多线程要执行的任务)
4、创建一个Thread类的对象,并开启线程
3.利用Callable接口和Future接口方式实现
特点:可以获取到多线程运行的结果
1.创建一个类实现Callable接口(有泛型限制,表示多线程返回的结果类型)
2.重写call(是有返回值的,表示多线程运行的结果)
3.创建MyCallable的对象(表示多线程要执行的任务)
4.创建FutureTask的对象(作用管理多线程运行的结果)
5.创建Thread类的对象,并启动(表示线程)
常用的成员方法:
细节:1、如果我们没有给线程设置名字,线程也是有默认的名字的:
格式:Thread-X(X序号,从0开始的)
2、如果我们要给线程设置名字,可以用set方法进行设置,也可以构造方法设置(要创建构造方法)
3、当JVM虚拟机启动之后,会自动的启动多条线程,其中有一条线程就叫main线程,他的作用就是去调用main方法,并执行里面的代码,在以前,我们写的所有代码,其实都是运行在main线程中的
线程优先级:
抢占式调度:随机性
守护线程:
当其他的非守护线程执行完毕之后,守护线程会陆续结束
线程的生命周期:
线程的安全问题:
同步代码块:
锁对象,一定要是唯一的(加static关键字)
同步方法:
就是把synchronized关键字加到方法上
特点1:同步方法是锁住方法里面所有的代码
特点2:锁对象不能自己指定
非静态:this
静态:当前类的字节码文件对象