day15
线程
主频:切换进程频率,越快越好。
核:能同时并行处理的进程。
?何时需要多线程
提高效率
程序是还没运行起来的代码,进程是运行起来的代码,线程是你在代码块中可以开的子代码块(支流),子代码与你的代码之间是互不影响的,可以都运行在一个进程中。
继承Thread类实现多线程
多线程的创建和启用
Thread类
可以开任意多个线程!t3-tn!
为什么多次运行“------”的位置不一样?
同步就是严格按照代码的顺序执行的。
实现Runnable接口实现多线程
这个t-1,t-2名称的作用?可以观察多线程的异步!
两种实现线程的方式的区别于联系
接口的方法都是没有方法体的!继承是重写run方法,实现接口是实现run方法!
举例:多个线程可以共同一个接口实现类的对象。(比较用runnable!)
可以从结果中得出,开启的两个线程是共享了count资源。
Thread类的相关方法1
改名:
设置优先级
观察执行顺序:说明这只是一个概率!
Thread类的相关方法2
线程让步
插入,-----3被阻塞。
睡眠
强制 stop
线程的生命周期(线程从生到死的经历)
阻塞存疑?
线程的同步与死锁
提款方法,判断账户钱够不够
模拟多线程
main方法
结果:多线程调用这个方法存在线程共享资源时,一个线程在执行这个方法没有完毕时,另一个线程又开始执行这个方法。
此时有个问题!修改此方法
新加drawing1()方法
变成两个对象,调用两个不同的方法。
此时还是会出现资源问题,变成-1000。
结论 :同步锁如果放在方法上,那么在第一个用该方法的进程会独占这个方法直到该方法运行完,这个时候下一个进程才能运行该方法。所以线程使用不同的对象执行此方法是,还是有资源共享的问题。
举例:变成静态方法后,所有对象就都使用同一个锁了。
Synchronized的使用方法
怎么锁代码块呢?新增drawing3()方法。
(静态方法可以用对象访问,即可以用实例化对象调用,只是不推荐,因为直接类名调用即可。)
用一个账户,都调用drawing3()方法。
结论:。
不管是几个方法,都是使用的同一个同步锁,就是说如果有drawing4(),内容和3一样,两个对象分别调用两个方法,线程还是可以正常运行。
新问题:
又变成各跑各的了。
都用a对象,就一样了。
结论:
总结:
线程的通信
新需求
永远都是先执行支付宝
生产者与消费者
消费者
结果