zoukankan      html  css  js  c++  java
  • 59.Java线程概述

    线程的概述

    进程:正在运行的程序,负责了这个程序的内存空间分配,代表了内存中的执行区域。

    线程:就是在一个进程中负责一个执行路径。

    多线程:就是在一个进程中多个执行路径同时执行。

    多线程的好处:

    1. 解决了一个进程里面可以同时运行多个任务(执行路径)。
    2. 提供资源的利用率,而不是提供效率。

    多线程的弊端:

    1. 降低了一个进程里面的线程的执行频率。
    2. 对线程进行管理要求额外的 CPU开销。线程的使用会给系统带来上下文切换的额外负担。
    3. 公有变量的同时读或写。当多个线程需要对公有变量进行写操作时,后一个线程往往会修改掉前一个线程存放的数据,发生线程安全问题。
    4. 线程的死锁。即较长时间的等待或资源竞争以及死锁等多线程症状。

     

     线程的调度:

    计算机通常只有一个cpu,在这种情况下,所谓多线程从宏观上看是并发进行的,但是微观下还是串行的,因为同一时刻只能有一个线程运行。

    有两种调度模型:

    分时调度:所有线程平分cpu的时间片,轮流占用CPU

    抢占式调度:根据优先级占用CPU

    Java使用的是抢占式调度,也就是每个线程将由操作系统来分配执行时间,线程的切换不由线程本身来决定(协同式调度)。这就是平台独立的原因。 

    线程的状态

    创建:新创建了一个线程对象。

    可运行:线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取cpu的执行权。

    运行:就绪状态的线程获取了CPU执行权,执行程序代码。

    阻临时塞: 阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。

    死亡:线程执行完它的任务时。

    sleep():是线程方法, 放弃CPU, 转到阻塞状态。当睡眠结束后,先转到就绪状态,分到时间片后再运行,不会放弃同步锁

    wait():是Object方法,会放弃同步锁,必须在有对象锁的情况下才能执行,否则报异常

    join():方法是属于Object的实例方法。挂起当前线程(一般是主线程),直至它所调用的线程终止才被运行。

      例如a线程中b.join()则a等b执行完后才运行

    interrupt():中断某个线程的运行,抛出interruptException异常,try捕获,catch处理

    线程的thread.interrupt()方法是中断线程,将会设置该线程的中断状态位,即设置为true 抛出interruptException异常,未设置为false,中断后结果 即线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于如何处理抛出的异常了。

     sleep,wait,join方法都要用try catch包裹,异常会报interruptException

    author@nohert
  • 相关阅读:
    Java并发
    JS的强制类型转换
    JS的原生函数
    JS的类型和值
    解决Oracle临时表空间占满的问题
    nginx location匹配规则
    java.util.ConcurrentModificationException 解决办法
    SQL优化三板斧:精简之道、驱动为王、集合为本
    一次非典型SQL优化:如何通过业务逻辑优化另辟蹊径?
    一次耐人寻味的SQL优化:除了SQL改写,还要考虑什么?
  • 原文地址:https://www.cnblogs.com/gzgBlog/p/13597013.html
Copyright © 2011-2022 走看看