线程详解,线程间的共享和协作

基础概念

  1. cpu核心数和线程数的关系:  核心数:线程数=1:1,使用了超线程技术后为1:2

  2. cpu时间片轮转机制: 又称为RR调度,会导致上下文切换

  3. 进程和线程: 

    进程:程序运行资源分配的最小单位,进程内部有多个线程,会共享这个进程的资源

    线程:CPU调度的最小单位,必须依赖进程而存在

  4. 并行和并发

     并行:同一时刻,可以同时处理事情的能力      

     并发:与单位时间相关,在单位时间内可以处理事情的能力  

高并发编程的优点和注意事项

  1. 优点:充分利用CPU的资源、加快用户响应的时间,程序模块化、异步化

  2. 注意事项:线程共享资源,存在冲突;容易导致死锁;启用太多的线程,容易拖垮机器

Java中的线程

     大家肯定都听说过这句话:“Java天生就支持多线程”!!!下面我们就介绍下Java中的线程

扫描二维码关注公众号,回复: 10416167 查看本文章
  1. Java中创建线程的三种方式,这里就不一 一介绍了
  2. 怎样才能让Java中的线程安全停止工作?                                                                                                                              线程自然终止:自然执行完或抛出未处理异常stop(),resume(),suspend()(suspend方法已不建议使用)stop()会导致线程不会正确释放资源,suspend()容易导致死锁。
  3. Java线程是协作式,而非抢占式:调用一个线程的interupted()方法中断一个 线程,并不是强行关闭这个线程,知识跟这个线程打个招呼,将线程的中断标志位置置为true,线程是否中断,有线程本身决定。
  4. isInterrupted()方法作用:判定当前线程是否处于中断状态。
  5. static方法interrupted()判定当线程是否处于中断状态,同时中断标志位改为false。
  6. 方法中如果抛出InterruptedException,线程的中断标志位会被复位为false,如果确实是需要中断线程,要求我们自己在catch语句块中再次调用interrupt()。

线程常用方法和线程的状态

  1. 线程只有5中状态,整个生命周期就是这几种状态的切换。

  2. run()和start():run方法就是普通对象的普通方法,只有条用了start()之后,Java才会将线程对象和操作系统中实际的线程进行映射,再来执行run()方法。   

  3. yield()方法:让出CPU的执行权,将线程从运行转到可运行状态,但是下个时间片,该线程依然有可能被再次选中运行。

  4. 线程的优先级:取值为1~10,缺省值为5,单线程的优先级不可靠,不建议作为线程开发时候的手段。

  5. 守护线程:和主线程共生死,finally不能保证一定执行。

线程间的共享

  1. synchronized内置锁:对象锁,锁的是累的对象实例;类锁,锁的是每个累的的Class对象,每个类的Class对象在一个虚拟机中只有一个,所以类锁也只有一个。
  2. volatile关键字:适合于只有一个线程写,多个线程读的场景,因为它只能确保可见性。
  3. ThreadLoacl:线程变量,可以理解是个map,类型Map<Thread,Integer>
  4. 线程间协作:轮询,难以保证及时性,资源开销很大。
  5. 等待和通知:wait(),对象上的方法
  6. notify、notifyAll 对象上的方法
  7. 等待和通知的标准范式:                                                                                                                                                         
    1. 等待方:     a.获取对象的锁;    b.循环里判断条件是否满足,不满足调用wait()方法;  c.调用满足执行业务逻辑。
    2. 通知方:     a.获取对象的锁;     b.改变条件;    c.通知所有等待在对象的线程。

   

 

 

     

发布了7 篇原创文章 · 获赞 1 · 访问量 327

猜你喜欢

转载自blog.csdn.net/baidu_36882394/article/details/103548822