多线程、
一、线程创建方式一lll
0l’l’l
1、注意事项
1、start方法,否则相当于单线程:
2、主线程任务在后
1、方式二:实现Runnable接口
任务对象----------->线程对象
2、方式二:匿名内部类创建子线程
以上方法不足之处
3、方式三:callable接口,futureTask实现(run()可以返回结果)
callable任务:实现callable接口、重写call方法
可以获取线程执行结果!!!
call()方法返回结果是string,因此用string接
二、Thread方法
1、常用:getName、currentThread、sleep、join
2、setName()
3、线程按顺序执行:join
三、线程安全
案例:同时取钱
将一个账户对象交给两个线程处理:
代码:
DrawAccount类并没有name属性,只能调用父类Thread的super()为线程setName
思路:
1、重写run方法、封装操作类Account
2、DrawAccount类中想调用操作类方法就必须要有成员变量acc
3、Account类中想操作就必须有成员变量money
4、线程start方法想执行run方法就必须传参acc才能调用run中的操作类
1、同步代码块:synchronized
账户取钱(对比小明小红送礼物)
synchronized(this):this代表Account类中的账户对象,而Account对象只new了一次(由acc、acc1对象调用的drawMoney方法),线程的start方法自动调用run()方法,被锁住只能一个一个访问!!
2、同步方法
3、lock锁
4、线程通信
四、==线程池
1、线程池概念
2、ThreadPoolExecutors创建线程池对象
3、 线程池方法:execute、submit的区别
线程复用并获取返回结果
4、拒绝任务
5、Executors创建线程池对象
五、并发、并行、生命周期
1、并发、并行
2、生命周期
六、乐观锁、悲观锁
1、悲观锁
synchronized(this):this代表MyRunnable对象,而MyRunnable对象只new了一次,多个线程访问该对象的时,线程的start方法自动调用run()方法,被锁住只能一个一个调用!!
2、乐观锁
原理
源码