• 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)

                        

  • 相关阅读:
    OpenSSL: error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version
    Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
    for循环用了那么多次,但你真的了解它么?
    使用git克隆github上的项目失败,报错error: RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054
    idea修改svn地址
    Eureka服务注册中心错误:com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect
    Tensorflow学习资源
    编程工具使用技巧
    博客链接
    python学习笔记
  • 原文地址:https://www.cnblogs.com/xieyulin/p/7060957.html
Copyright © 2020-2023  润新知