zoukankan      html  css  js  c++  java
  • Java多线程

    一、多线程(学好多线程需要长期实践开发的过程

         1、概述: 进程是操作系统进行资源分配和调度的基本单位
                   线程是CPU调度的基本单位
         2、Java启动JVM会启动一个进程
                   包含一个main()主线程,和一个GC守护线程
         3、一般线程里放的都是耗时操作
                 Android里耗时操作不可以放在主线程,必须在启一个线程
         4、方式一:
                 继承Thread类,重写run()方法,创建对象,启动线程
         5、方式二:
                 实现Runnable接口,实现run()方法,将该类的实例传递给Thread对象,
                 解决单继承的局限性,实现多线程之间的数据共享
         6、线程的优先级只是CPU调度的一个参数,同时还有许多其他系统进程或线程在执行,
                 所以很多时候结果并不绝对,Android里也是,线程调度要参考很多因素
         7、线程控制
             sleep():线程睡眠
             jion():    线程加入,将某个线程或片段加入另一个线程的顺序执行
             yield():线程礼让到就绪状态
             setDaemon():设置为后台线程,也即守护线程,如果没有其他线程执行,
                           只有守护线程,虚拟机将退出  
             intterrupt():中断线程。仅仅是将该线程的interrupt标志置位;
                           在该线程内部检测是否被中断,如果该线程当前不在执行状态,
                           会收到一个InterruptedException异常,
                           则程序员可以在catch语句内处理异常使该线程退出
          8、线程的生命周期
                   新建、就绪、运行、阻塞、死亡
          9、线程同步
                 synchronized(this){}将代码块实现原子操作,this为同步锁
                 如果一个方法内的代码都需要同步,则可以将方法声明为synchronized.
                 但是线程同步很耗费系统资源
          10、线程锁
                interface Lock Lock实现提供了比使用synchronized方法和语句更广泛的锁定操作
                ReentrantLock lock = new ReentrantLock()
          11、死锁问题
                   有嵌套锁,两个以上的线程因为争夺资源相互等待的条件才能造成死锁
          12、线程间通信(互斥、同步)
                   任何对象都可以充当锁,而锁可以作为线程间通信的信号量,
                   故Object类提供了等待唤醒机制的方法:
                          wait():   锁对象.wait()   将线程放到锁的WaitSet中,等待唤醒
                          notify(): 锁对象.notify() 从WaitSet中随机唤醒一个线程
                          notifyAll():
           13、线程状态之间的转换
                 
             14、线程组
                   Java中使用ThreadGroup来表示县城组,它可以对一批线程进行分类管理,
                   java运行程序直接对线程组进行管理和控制
                   从对线程的批量管理角度,比线程池更强大好用
                   
            15、线程池
                    JDK5之后开始支持线程池
                    线程池里的每一个线程代码结束后,并不会死亡,
                    而是再次回到线程池中成为空闲状态,等待下一次使用
                    
                    优点:启动一个线程的成本是比较高的,因为它涉及到与操作系统进行交互,
                          这种情况下使用线程池可以更好的提高系统性能,尤其在当前程序需要
                          创建大量的生存周期很短的线程时,更应该考虑使用线程池。
                    ExecutorService mypool = Executors.newFixedThreadPool(100);
            
            16、定时器Timer类
                 Timer类是一个应用十分广泛的线程工具
                 可用于调度多个定时任务以后台线程的方式来执行,
                 TimerTask类  和Timer类的使用
     
            17、线程的正确终止方法
                    stop是错误的停止方法,它会使线程突然停止,来不及做任何处理工作,
                    对数据和业务都非常有害
                   正确的停止方法是设置退出标志  volatile关键字,可见性
                      volatile boolean keepRunning = true;
                      run(){
                        while(keepRunning){
                              do some thing;
                        }
                      }
                        线程.keepRunning = false;
     
           18、线程安全的类
                   你会看到有很多类都将自己的某些方法声明为synchronized,表示它将自己的操作
                   方法声明为原子操作,也就是该类自己考虑了在多线程时的线程安全问题,使用者
                   将不需要再考虑,所以这种方式提供了友好的接口,
                   
                   在自己的开发过程中,要不断的在实践中总结,也要多阅读很牛的项目的代码,
                   看人家的良好代码能够给自己很多有有意义的启发。
     
            19、总结
                
             20、扩展Java并发知识
                    1、Java Memory Mode
                       JMM描述了Java线程如何通过内存进行交互
                       happens-before(偏序关系)
                       synchronized, volatile & final
                    2、Lock & Condition类
                       Java锁机制和等待条件的高层实现
                    3、线程安全性
                        原子性与可见性   atomic 
                    4、多线程编程常用的交互模型
                          生产者-消费者模型
                          读写锁模型
                          future模型
                          worker Thread模型
                        在Java并发实现中是有哪些类直接实现了这些模型可以供我们直接调用的 
                          
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     





  • 相关阅读:
    C语言面试题大汇总
    cocos2d-x的win32编译环境
    完美解决Android SDK Manager无法更新
    ADT离线安装教程
    Android开发环境搭建教程
    如何利用dex2jar反编译APK
    Eclipse与Android源码中ProGuard工具的使用
    Proguard语法及常用proguard.cfg代码段
    Android之ProGuard混淆器
    Nutch源码阅读进程2---Generate
  • 原文地址:https://www.cnblogs.com/rocomp/p/4776185.html
Copyright © 2011-2022 走看看