多线程基础
1.1什么是多线程
线程是程序执行的一条路径,一个进程可以包含多个线程;
多线程并发执行可以提高程序的效率,同时完成多项工作;
1.2并行和并发
并行:两个任务同时运行,(需要多核cpu)
并发:两个任务请求运行,而处理器只能接受一个任务,就让两个任务轮流进行,由于时间间隔较短,给人感觉在同时原运
1.3构造方法
1.4线程实现方式
1.41继承Thread
定义类继承Thread
重写run方法
线程需要做的事情卸载run方法中
创建线程对象
开启线程,内部自动执行run方法
1.4.2实现runnble接口重写run方法
定义类实现runnble接口
重写run方法
线程需要做的事情卸载run方法中
创建runnble子类对象
创建Thread类,传入runnable对象
调用thread的start方法,内部会自动调用runnable的run方法
runnable原理:
Thead类的构造函数传入的Runnable的引用,Start()调用的run()方法时会判断Runable的引用是否为空,不为空时
走的时Runable的run方法。
1.5区别优弊
继承Theard:
可以直接使用Thread的方法;
因为的类的单继承,已有父类,就不能使用该方法
实现runable接口:
接口的多实现,父类也可以实现runnable接口
不能直接使用Thead的方法,需要先换取Thread对象
1.6名内部类实现线程的方式(不用特别去继承或实现Thread和Runnab)
1.6.1继承Thread
1.6.2实现Runnable接口
1.7守护线程
setDaemon(),设置一个线程为守护线程,该线程不会单独执行 ,但其他非守护线程执行结束后,自动退出。
1.8线程同步
多线程并发时般cpu会在多个线程切换执行,当希望cpu在执行某个线程未执行完前不要切换到其他线程时,就需要同步。
1.8.1同步代码块
使用synchronized关键字加上一个锁对象,同步代码块如果有相同的所对象,那么他们就是同步的。
1.8.2同步方法
使用synchronized关键字修饰一个方法,那么该方法所有代码都是同步的
注:非静态的同步方法所对象时this,静态方法所对象是该类的字节码对象
1.9 死锁
多线程同步的时候,如果同步代码嵌套,使用相同的所锁,就可能出现死锁
:
注:collcations中可以让非同步的集合转化未同步的