一.并发编程
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.总结
