一.并发编程
java实现并发编程的方式是多线程
其他语言,主打的 并发编程并不一样
Go 主要通过多协程的方式实现并发
erlang 是通过actor模型实现并发
JS 通过定时器和事件回调的方式实现并发
二.多线程
在java标准库,提供了一个Thread类,表示/操作线程
Thread类可以视为Java标准库提供的一组API
创建的Thread实例,其实和操作系统中的线程是一一对应的关系
1.Thread用法
1)创建子类,继承自Thread.并且重写run方法
线程之间是并发执行的实例
这个随机性,会给多线程编程带来其他麻烦
2)创建一个类,实现Runnabale接口,再创建Runnable实例传给Thread实例
3)/4)就是上面两个写法的翻版,使用了匿名内部类
1.
2.
一般认为Runnable的写法更好一些,能够做到线程和线程执行任务更好的解耦
写代码一般要求高内聚,低耦合
5)lambda表达式
2.多线程的用法
1.串型的方法消耗时间再183ms左右
2.多线程方法
这样是错的
此处不能直接记录结束时间,这个求时间戳的代码是在main线程中
main和t1和t2是并发执行的关系,这里t1和t2还没执行完,就开始记录结束时间了,这显然是不准确的
正确做法
让main线程等待t1和t2跑完,再记录结束时间
join()就是等待线程结束
3.多线程的属性
1.名字
2.是否为后台线程
3.是否存活
4..start()
决定了系统是否真的创建了线程
重点(start()和run()的区别)
run()
start()
5.中断线程
让一个线程停下来
线程停下来的关键,是让线程对应的run方法执行完,,
方法1
可以手动设置一个标志位(自己创建的一个boolean变量).来控制线程是否要执行结束
这样就要设置isQuit为私有静态变量
方法2
用Thread内置的一个标志位进行判定
6.线程等待
多个线程之间,调度顺序是不确定的
线程之间的执行是按照调度器来安排的.这个过程可以视为"无序,随机"..
有的时候我们需要,自己控制线程之间的顺序
线程等待就是一种控制线程执行顺序的手段
此处的线程等待,主要是控制线程结束的先后顺序
1.join()
调用join的时侯,哪个线程调用的join,哪个线程就会阻塞等待,等到对应的线程执行完毕为止,也就是对应线程的run()执行完
7.获取线程的引用
Thread.currentThread()能够获取到当前线程的引用.(Thread实例的引用)
哪个线程调用的这个 currentThread,就获取到的是哪个线程的实例~
1.
2.
8.线程休眠
4.总结