Java课程复习之线程

Java课程复习之线程

一、线程的概念

1.进程和线程

  • 进程
    一个进程就是一个执行中的程序,而每一个进程都有自己独立的一块内存空间、一组系统资源,每一个进程的内部数据和状态都是完全独立的。
  • 线程
    Java程序执行中的单个顺序的流控制称为线程多线程则指一个进程中可
    以同时运行多个不同的线程,执行不同的任务。
  • 线程与进程的区别
    同类的多个线程共享一块内存空间和一组系统资源,而线程本身的数据通常只有微处理器的寄存器数据,以及一个供程序执行时使用的堆栈。所以系统在产生一个线程,或者在各个线程之间切换时,负担要比进程小的多 。

2.多线程

  • 采用多线程技术可提高cpu利用率,提高系统性能

二、线程的创建(分工)

1.Thread类

  • 通过继承Thread类创建线程

2.Runnable接口

  • 接口抽象方法:public void run();

2.两种创建线程方法的比较

  • 直接继承线程Thread类。但是该类无法继承其他类
  • 实现Runnable接口。此种方法更加灵活,且多个线程可共享某个对象的资源

三、线程的控制与调度

1.线程的生命周期和状态的改变
在这里插入图片描述

2.线程调度与优先级

  • 线程调度:当有多个线程处于就绪状态时,线程调度程序根据调度策略安排线程的执行
  • 调度策略:
    • 抢占式调度(preemptive): 支持基于固定优先级的调度算法,高优先级线程抢占低优先级线程执行;
    • 时间片轮转调度(round-robin):对于同等优先级的线程,轮流分享CPU时间运行
  • 线程优先级:
    public static final int NORM_PRIORITY = 10;
    public static final int MIN_PRIORITY = 1;
    public static final int MAX_PRIORITY = 5;
    • 优先级高的线程只是比优先级低的线程更有机会执行,具体的执行情况还依赖于操作系统的支持,执行顺序并不是确定的
    • 设置线程和返回线程的优先级方法:
      public final void setPriority(int newPriority); // 设置线程的优先级。
      public final int getPriority(); // 返回线程的优先级。

四、线程的同步机制(互斥)

1.线程安全

  • 多个线程想要对某个对象进行并发更新操作,竞争共享资源,可能会产生不正确的结果。
  • 多线程同时访问共享资源(变量),导致线程安全问题
  • volatile:禁用CPU缓存 (可见性问题)

2.需要考虑线程安全问题的情形

  • 数据单线程内可见
    例如:线程的局部变量
  • 只读对象
    例如:String,Integer
  • 线程安全类
    例如:StringBuffer
  • 如果多个线程想要对某个对象进行并发更新操作,但又不属于上述三类,此时需要考虑线程安全问题,实现安全的同步机制。

3.线程安全问题的解决措施

  • 对象监视器(monitor)与synchronized
  • synchronized的三种用法:
    • synchronized 代码块:监视器就是指定的对象.
      同步块又称为临界区,保证同一时间只有一个线程执行同步块内的代码
    • synchronized 方法:监视器就是this对象。
    • synchronized 静态方法:监视器就是相应的Class对象

4.死锁问题

  • 如果多个线程都处于等待状态,彼此需要对方所占用的监视器所有权,就构成死锁(deadlock),Java即不能发现死锁也不能避免死锁。
  • 可能发生死锁的代码执行中不一定会死锁,因为线程之间的执行存在很大的随机性。

五、线程间的同步通信(协作)

  • 使用waitnotifyAll实现线程间同步通信
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值