线程

线程与进程的区别:

a)、进程之间是相互独立的,不共享内存和数据,线程之间的内存和数据是公用的,每个线程只有自己的一组CPU指令、寄存器
    和堆栈,对于线程来说只有CPU里的东西是自己独享的,程序中的其他东西都是跟同一个进程里的其他线程共享的。

b)、操作系统创建进程时要分配好多外部资源,所以开销大。
 (这个跟操作系统有关,有人做过实验,window创建进程的开销大,linux创建进程的开销就很小。)

c)、CPU 的线程数概念仅仅只针对 Intel 的 CPU 才有用,因为它是通过 Intel 超线程技术来实现的,如果没有超线程技术,
    一个 CPU 核心对应一个线程。
    对于一个CPU,线程数总是大于或等于核心数的。一个核心最少对应一个线程,但通过超线程技术,一个核心可以对应两个线
    程,也就是说它可以同时运行两个线程。

d)、一个系统中,同时存在的线程可以有很多(多于进程数),但是由于受到系统资源的限制,能够同时运行的最大线程数为:
    CPU个数 * CPU核心数 * CPU线程数。

理解线程的优先权

● 当线程的优先级没有指定时,所有线程都携带普通优先级。
● 优先级可以用从1到10的范围指定。10表示最高优先级,1表示最低优先级,5是普通优先级。
● 优先级最高的线程在执行时被给予优先。但是不能保证线程在启动时就进入运行状态。
● 与在线程池中等待运行机会的线程相比,当前正在运行的线程可能总是拥有更高的优先级。
● 由调度程序决定哪一个线程被执行。
● t.setPriority()用来设定线程的优先级。
● 在线程开始方法被调用之前,线程的优先级应该被设定。
● 可以使用常量,如MIN_PRIORITY,MAX_PRIORITY,NORM_PRIORITY来设定优先级

yield()方法

● Yield是一个静态的原生(native)方法
● Yield告诉当前正在执行的线程把运行机会交给线程池中拥有相同优先级的线程。
● Yield不能保证使得当前正在运行的线程迅速转换到可运行的状态
● 它仅能使一个线程从运行状态转到可运行状态,而不是等待或阻塞状态

join()方法

1、Thread类中的join方法的主要作用就是同步,它可以使得线程之间的并行执行变为串行执行。

2、join方法的作用:
  ●  在A线程中调用了B线程的join()方法时,表示只有当B线程执行完毕时,A线程才能继续执行。注意,这里调用的join方法
     是没有传参的;

  ● join方法中如果传入参数,则表示这样的意思:如果A线程中掉用B线程的join(10),则表示A线程会等待B线程执行10毫秒,
     10毫秒过后,A、B线程并行执行。需要注意的是,jdk规定,join(0)的意思不是A线程等待B线程0秒,而是A线程等待
     B线程无限时间,直到B线程执行完毕,即join(0)等价于join()。

3、join与start调用顺序问题
      ● join方法必须在线程start方法调用之后调用才有意义。这个也很容易理解:如果一个线程都没有start,那它也就
        无法同步了。

4、join方法实现原理
      ● join方法的原理就是调用相应线程的wait方法进行等待操作的,例如A线程中调用了B线程的join方法,则相当于在
        A线程中调用了B线程的wait方法,当B线程执行完(或者到达等待时间),B线程会自动调用自身的notifyAll方法
        唤醒A线程,从而达到同步的目的。

线程的生命周期:

线程的一个完整的生命周期中通常要经历如下五种状态:

  ①、新建:当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态;

  ②、就绪:处于新建状态的线程被start()后,将进入线程队列等待CPU时间片,此时它具备了运行的条件;

  ③、运行:当就绪的线程被调度并获得处理器资源时,便进入运行状态,run()方法定义了线程的操作和功能;

  ④、阻塞:再某种特殊情况下,被人为挂起或执行输入输出操作时,让出CPU并临时中止自己的执行,进入阻塞状态;

  ⑤、死亡:线程完成了它的全部工作或线程被提前强制性的中止。
线程的生命周期.png

sleep和wait的区别?

    ● sleep是Thread类的一个静态方法,wait是Object类的方法;

    ● sleep方法是在指定的时间内进入休眠状态,时间一到,就被唤醒;

    ●  wait可以指定时间,也可以不指定,不指定的时候必须调用notify或者notifyAll方法才能唤醒,指定的话,时间 
       一到自动唤醒

    ●  wait()睡眠时,释放对象锁, sleep()睡眠时,保持对象锁,仍然占有该锁,只是让出cpu给其他线程使用

指令重排序

  编译器或运行时环境为了优化程序性能而采取的对指令进行重新排序执行的一种手段。

as-if-serial语义

  as-if-serial语义的意思指:不管怎么重排序(编译器和处理器为了提高并行度),(单线程)程序的执行结果不能被改变。

你可能感兴趣的:(线程)