Java学习之多线程

多线程:

  (一)进程与线程

       进程特点

       并发与并行的区别:

       多线程编程的好处:

                    

    (二)线程的建立

     1,通过继承Thread类,代码如下:

 View Code

     2,通过实现Runnable接口,代码如下:

 View Code

       3,通过实现Callable接口和Future包装来建立:

 View Code

    三种建立多线程的优劣比较有:

          

  (三)线程的生命周期

     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代码模拟银行取款实例,同过对方法加入同步锁来实现账户的一致性,合理性(下面情况假设是当某个线程突然中断了,而另一个线程接着执行的异常情况)

     账户类:

 View Code

    多线程测试:

 View Code

    同步方法的使用规则:

                 

    2,线程监视器的释放情况

                   

    3,加显示锁(lock)而synchronized是隐式锁结构

        使用lock的Account类Java代码:

 View Code

    4,死锁:   

                 

        死锁测试Java用例:

 View Code

     死锁情况的描述描述:

                    

  (六),线程通信

    1,传统的线程通信:使用synchronized来同步线程,使用wait();notify();和notifyall();方法来实现线程通信

                                  

      2,Lock下同步实现线程通信:使用Condition来控制线程,Condition类的三个方法:await(),signal();signalAll();

      3,使用阻塞队列(BlockingQueue)来实现通信:(利用队列先进先出的特性加队列来控制,一端为建立线程,另一端为使用线程,位于队列中的线程处于等待,

                     处于入队列外的处于阻塞状态)

  (七)线程池

                      

      java8通过使用ForkJoinPool线程池来实现CPU的多核并行运算(下面该程序可以自行获取物理机上的核数)

 View Code

  (八)线程相关类(ThreadLocal)

                    

原文地址:https://www.cnblogs.com/xieyulin/p/7060957.html