1.程序

程序:是对数据描述操作的。 代码集合。是应用程序执行脚本静态

2.进程

3.线程

4.多线程

  • 如果希望 程序实现“多段程序代码” 交替运行的效果,则 需要创建多个线程,即 多线程 程序。
  • 单线程执行时只有一个路径CPU就一直按按照这个路径执行多线程多个路径CPU在多个路径切换执行

5.自定义线程类 :

5.1 继承Thread

5.2 实现Runnable接口

6.多线程的生命周期及状态转换

新建状态 (New)

就绪状态 (Runnable)

运行状态 (Running)

  • 就绪状态线程获得了CPU的使用开始执行run()方法,则线程处于运行状态。当一个线程启动后,它不可能一直处于运行状态

阻塞状态 (Blocked)

  • 一个正在执行的线程某些特殊情况下,如执行耗时的输入/输出操作会放弃CPU的使用进入 阻塞状态。只有当引起 阻塞原因消除线程才可以转入就绪状态

  • 当线程试图获取某个对象的 同步 时,如果该锁其他线程所持有时,线程会由运行状态转为阻塞状态

  • 当调用一个阻塞的IO方法,要等待这个阻塞的IO方法返回,此时 线程会由运行状态转为阻塞状态

  • 当线程调用了某个对象的wait()方法,此时 线程会由运行状态转为阻塞状态需要使用notify()方法唤醒该线程

  • 当线程调用了Thread的sleep(long millis)方法时,此时 线程会由运行状态转为阻塞状态等到休眠时间到了才能进行“就绪状态

  • 线程调用了另一个线程join()方法时,此时 线程会由运行状态转为阻塞状态需要加入的线程运行结束才能结束阻塞

死亡状态 (Terminated)

  • 当线程的run()方法中代码正常执行完毕或者抛出一个未捕获的异常或者错误,线程进入死亡状态。线程将不在拥有运行的资格也不能再转化到其他状态

7.多线程的调度

线程的优先级

线程的休眠

线程的让步

  • 线程让步 可以通过yield()方法来实现,该方法和sleep()方法有点相似都可以让当前 “正在运行” 的线程暂停
  • 区别在于yield()方法不会阻塞该线程,它只是将线程转换为就绪状态,重新进入线程排队”状态。
    sleep() 会让线程进入阻塞状态睡眠结束,该线程才重新进入就绪状态,进行“线程排队”。

yield() 和 sleep() 的区别

  • 两个方法功能有点相似 : 都可以当前正在运行”的线程暂停最后使线程进入就绪状态,后进行“线程排队
  • yield() 方法不会阻塞该线程,它只是将线程转换为就绪状态,重新进入“线程排队”状态。
    sleep() 会让线程进入阻塞状态睡眠结束,该线程才重新进入就绪状态,进行“线程排队”。
  • yield() 告诉操作系统当前线程愿意放弃CPU执行时间片,重新进入“就绪状态”,进行“线程排队”。但是否会马上执行该“就绪状态”的线程得看操作系统分配了。
  • sleep() 使得该线程进入休眠状态,休眠中为“阻塞状态”。当休眠结束时,线程重新进入“就绪状态”,进行“线程排队”。

8.多线程同步通信

8.1 多线程的同步

8.2 多线程通信

  • 线程通信 指的是一个线程完成了自己的任务时,要通知另外一个线程去完成另外一个任务

  • 要完成线程之间的通信,就需要控制多个线程按照一定的顺序轮流执行

  • Object类中提供了wait(), notify()notifyALL()方法用于解决线程之间的通信问题

  • 这三个方法的调用者应该同步锁对象,否则会抛出IllegalMonitorStateException异常

  • 方法名称 功能描述
    void wait() 使当前线程放弃同步锁进入等待,直到其他线程进入此同步锁,并调用notify()或notifyAll()方法唤醒该线程为止。
    void notify() 唤醒同步锁上等待第一个调用wait()方法的线程。
    void notifyAll() 唤醒此同步锁上调用wait()方法的所有线程。

原文地址:https://blog.csdn.net/m0_70720417/article/details/134744361

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_26522.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注