Java学习之多线程
多线程:
(一)进程与线程
进程特点
并发与并行的区别:
多线程编程的好处:
(二)线程的建立
1,通过继承Thread类,代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
2,通过实现Runnable接口,代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
3,通过实现Callable接口和Future包装来建立:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
三种建立多线程的优劣比较有:
(三)线程的生命周期
1,新建(new)和就绪(Runnable) :new一个线程就是新建,调用start()就是就绪状态。
2,运行(runing)和阻塞(Blocked)
3,线程死亡(Dead)
(四)线程控制
1,join: 让一个线程等待另一个线程执行完 Thread td.join()
2,后台线程(DaemonThread):为其他线程提供服务,如垃圾回收机制(GC),特点:直到其他线程都结束,该线程才结束
3,sleep:使正在执行的线程进入阻塞状态 Thread.sleep(1);
4,yield:线程让步 功能类似sleep,但与sleep的区别如下:
5,改变优先级(setPriopity)
(五),线程同步(Thread Synchronized)
下面用Java代码模拟银行取款实例,同过对方法加入同步锁来实现账户的一致性,合理性(下面情况假设是当某个线程突然中断了,而另一个线程接着执行的异常情况)
账户类:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
多线程测试:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
同步方法的使用规则:
2,线程监视器的释放情况
3,加显示锁(lock)而synchronized是隐式锁结构
使用lock的Account类Java代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
4,死锁:
死锁测试Java用例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
死锁情况的描述描述:
(六),线程通信
1,传统的线程通信:使用synchronized来同步线程,使用wait();notify();和notifyall();方法来实现线程通信
2,Lock下同步实现线程通信:使用Condition来控制线程,Condition类的三个方法:await(),signal();signalAll();
3,使用阻塞队列(BlockingQueue)来实现通信:(利用队列先进先出的特性加队列来控制,一端为建立线程,另一端为使用线程,位于队列中的线程处于等待,
处于入队列外的处于阻塞状态)
(七)线程池
java8通过使用ForkJoinPool线程池来实现CPU的多核并行运算(下面该程序可以自行获取物理机上的核数)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
(八)线程相关类(ThreadLocal)