博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java多线程
阅读量:5116 次
发布时间:2019-06-13

本文共 2113 字,大约阅读时间需要 7 分钟。

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

     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并发实现中是有哪些类直接实现了这些模型可以供我们直接调用的 
                      
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

转载于:https://www.cnblogs.com/rocomp/p/4776185.html

你可能感兴趣的文章
Jzoj4757 树上摩托
查看>>
CF992E Nastya and King-Shamans(线段树二分+思维)
查看>>
第一个Java Web程序
查看>>
树状数组_一维
查看>>
如果没有按照正常的先装iis后装.net的顺序,可以使用此命令重新注册一下:
查看>>
linux install ftp server
查看>>
嵌入式软件设计第8次实验报告
查看>>
算法和数据结构(三)
查看>>
Ubuntu下的eclipse安装subclipse遇到没有javahl的问题...(2天解决了)
查看>>
alter database databasename set single_user with rollback IMMEDIATE 不成功问题
查看>>
Repeater + Resources 列表 [原创][分享]
查看>>
WCF揭秘——使用AJAX+WCF服务进行页面开发
查看>>
【题解】青蛙的约会
查看>>
IO流
查看>>
mybatis调用存储过程,获取返回的游标
查看>>
设计模式之装饰模式(结构型)
查看>>
面向对象的设计原则
查看>>
Swift3.0服务端开发(三) Mustache页面模板与日志记录
查看>>
【转】 FPGA设计的四种常用思想与技巧
查看>>
EntityFrameWork 实现实体类和DBContext分离在不同类库
查看>>