第1章 创建线程
1.1 Thread类
l 构造方法
l 常用方法
1.2 创建线程方式一继承Thread类
获取线程名称
自定义run方法,需要继承Thread,然后重写run方法。
之后主线程走代码执行,到开启代码的时候开启run方法,之后运行到for循环,这个时候已经开的run方法线程也开始走了,所以就是一起执行,效果图
1.2.1 多线程的内存图解
原理图:
两个都是站,首先在栈里的main方法中的主线程运行,创建新线程后开启另一个栈新的栈里面继承了Thread重写了run方法并且。这个时候main方法所在的主线程走到了开启线程,也就是运行线程,所以run方法线程里的for循环和刚开启玩线程的main方法也开始下一波的代码运行,就是俩两个for循环一起运行,因为java是用的抢占式调度所以显示的没有顺序。这就是多线程原理,主线程的地位
1.3 创建线程方式—实现Runnable接口
l 接口中的方法
l Thread类构造方法
1.3.1 实现Runnable的原理
Runnable是接口,Threads是继承, Runnable避免了单继承性,Threads类中的继承了run方法的MyThreads类中,只继承了Threads不能再继承其他类,而Runnable是接口,Runnable中的MyRunnable重写run方法的实现类中实现了Runnable并且如果你有其他的需求,可以再继承别的类。
Threads的运行代码顺序是创建新线程和开启新线程都是用thread调用。
而Runnable只负责开启线程,比较推荐Runnable
对比一下
Runnable
Threads
1.3.2 实现Runnable的好处
Runnable接口避免了单继承的局限性,所以较为常用。
实现Runnable接口的方式,更加的符合面向对象,线程分为两部分,一部分线程对象,一部分线程任务。
继承Thread类,线程对象和线程任务耦合在一起。一旦创建Thread类的子类对象,既是线程对象,有又有线程任务。实现runnable接口,将线程任务单独分离出来封装成对象,类型就是Runnable接口类型。Runnable接口对线程对象和线程任务进行解耦。
(也就是说,Thread粘合性太强,一个错全部错,而Runnable可以拆分一样)
Runnable测试类
MyRunnable重写run方法
1.4 线程的匿名内部类使用
/* 匿名内部类
new 父类或接口类名(){
需要重写的方法
}
*/
Thread内部类
new完之后快捷键点出来就可以了,想要多次运用可以创建个对象接受
Runnable内部类
New完之后方法点出来给他顶一个run接收一下返回值
第2章 线程池
2.1 线程池概念
可以创建一个容器来容纳线程,省去了创建线程的操作,并且用完了的线程可以返回到线程池里,下图为老式办法,但是原理是一样的
2.2 使用线程池方式—Callable接口
线程状态