学习笔记 6月3日(周四):内容7 线程

Posted 进步一丢点everyday

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习笔记 6月3日(周四):内容7 线程相关的知识,希望对你有一定的参考价值。

进程与线程

  • 进程属于操作系统的,进程和线程都是由操作系统所体会程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的主要区别:
    –一个程序至少由一个进程,一个进程至少有一个线程。线程的划分尺度小于进程,是的多线程程序的并发性搞。
    –进程在执行过程中拥有独立的内存单元,而多分线程共享内存,从而极大低提高了程序的运行效率。
    –线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能单独执行,必须依存在应用程序中。
    –从逻辑角度来看,多线程的意义在于一个应用程序中有多个执行部分可以同时执行。操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理,以及分配资源。
    –线程具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位
    –线程是进程的一个实体,是cpu调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程本身基本上不拥有系统资源,只拥有一点在运行时候必不可少的资源(如程序计数器、一组寄存器和栈),但是它可以与同属一个进程的其他线程共享进程所拥有的全部资源。
    –一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行
    它们饿主要差别在于,它们是不同的操作系统资源管理方式。
  • 一个具有生命的线程有哪些状态
    创建、就绪、运行、阻塞、死亡
    –创建:仅仅是实例化了Thread对象。还没有调用start()方法,此时isAlive()是false;
    –就绪:线程有资格运行,但是调度程序还没有把他选为运行线程时候所处的状态。调用了start()方法,线程不处于运行状态,此时isAlive()是true;
    –运行:从就绪状态池(注意不是队列,是池)中被选择为当前执行的线程所处的状态;
    –阻塞:线程仍然是活得,只是缺少运行条件,一旦具备条件,就可转为就绪状态
    –死亡:一个线程的run()方法运行结束。那么该线程完成器使命,死亡状态。但是仍然是一个Thread对象,仍可以被引用。但是线程一旦死去,就永远不能重新启动了。
  • 启动线程是start()方法开始
    当用start()开始一个线程后,线程就进入就绪状态,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。但是这并不意味着线程就会立即运行。只有当cpu分配时间片时,这个线程获得时间片时,才开始执行run()方法。start()是方法,它调用run()方法.而run()方法是你必须重写的. run()方法中包含的是线程的主体(真正的逻辑)。
  • 在java中每个类都有一个主线程,要执行一个程序,那么这个类当中一定要有main()方法,main()方法是java类中的主线程。自己创建线程有两种方法,一种是继承Thread类,另一种是实现Runnable接口。一般情况下,最好避免,因为java中是单根继承的,如果继承了Threa类,则无法再继承其他类。
  • Thread类实现了Runnable接口,不是抽象类。
  • 线程同步
    线程共享了相同的资源,但是在某些重要的情况下,一次只能让一个线程来访问共享资源。
    方法:
    –共享变量
    –存在于同一个内存空间中的所有线程
    –受控访问的同步
    关键字synchronized和volatile
    synchronized有以下两个重要含义(1)一次只有一个线程可以执行代码的受保护部分。(2)一个线程更改的数据对于其他线程是可见的
    –确保共享数据更改的可见性
    –同锁保护的原子代码块
  • java线程的调度和优先级
    线程调度的意义在于jvm应对运行的多个线程进行系统的协调,以避免多个线程争用有限资源而造成应用系统死机或者崩溃。
    –java中定义了线程的优先级策略,分为10个等级,分别是1-10之间,数字越大表明线程的级别越高。Thread类中表示线程最低、最高和普通优先级的成员变量分别是MIN_PRIORITY、MAX_PRIORITY和NORMAL_PRIORITY分别代表1、10、5级,默认是5级。
    –线程调度器会采用抢占式策略来调度线程的执行,优先级高的会被先执行,相同优先级的线程采用轮转的方式分配cpu。
  • yield()方法会使得线程从运行状态转为就绪状态
  • sleep()方法可以使得其他线程(比如低于它优先级的线程执行)但它并不释放对对象锁
  • wait()和notify()中wait()是如果条件不满足则等待,条件满足则唤醒(唤醒使用notify()),二者都属于Object类,而不是Thread类。

以上是关于学习笔记 6月3日(周四):内容7 线程的主要内容,如果未能解决你的问题,请参考以下文章

学习笔记 6月3日(周四):内容7 线程

Linux学习笔记十二周四次课(4月26日)

Linux学习笔记第五周第二次课(3月6日)

学习笔记(10月26日)--复习&练习

Linux学习笔记第五周第三次课(3月7日)

3月7日学习笔记