• 多线程


    一个cpu同一时间,只能执行一个命令

    yield() 该线程释放cpu的执行权,让步与其他线程,自己稍后执行

    join()   A线程中调用B线程的jion(),表示,A线程执行到此停止执行,知道B线程执行完毕,A线程再继续执行

    isAlive() 判断当前线程是否还存活

    sleep(long 1) 显式的让当前线程睡眠  1毫秒

    多线程实现的方式

    1-extends Thread

    2-implements Runnable

      优点:

        1-可以多实现

        2-便于多线程操作同一份资源

    同步监视器:由类的对象充当,获取监视器的线程就执行同步代码块

    使用单线程完成多个任务 比 使用多线程完成多个任务时间要短(因为多了个cpu切换的时间),为什么还要使用多线程?

    1-用户体验,提高应用程序响应

    2-提高cpu的利用率

    3-改善程序结构,将复杂的进程,拆分为多个线程,独立运行,利于理解和修改

    线程分类:1-用户线程   2-守护线程

    线程的生命周期: 新建,就绪,运行,死亡,阻塞

    是否释放锁:

      不会:sleep();yield();

      会:  break;return;wait();未处理的Error和Exception;

      

    死锁:不同线程分别占用彼此需要的共享资源不放弃,都在等待对方释放自己需要的资源。

    解决:1-尽量减少同步定义

        2-专门的算法和原则

    线程通信:

      以下方法均定义在基类Object对象中,并且只能在同步代码块或同步方法中使用。 否则异常IllegalMonitorStateException

      wait();  挂起当前线程,并放弃CUP、同步的共享资源,等到被别的线程唤醒后再继续操作

      notify(): 唤醒等待线程中优先级最高的一条线程

      notifyAll(): 唤醒所有等待的线程集

    JUC高级:

    内存可见性问题:

    1-volatile: 内存可见性,多个线程操作共享数据,保证内存数据可见   ;volatile-不具备互斥性,不能保证原子性

    原子性问题:

    2-原子变量与CAS算法

      典型问题:i++   读-改-写   三个步骤

     原子变量:volatile保证内存可见性

          CAS(compare and swap)算法保证数据的原子性

    3-同步的第三种方法--显式同步锁  Lock    =new ReentrantLock();   lock.lock(); lock.unlock();

       同步条件  Condition =lock.newCondition();    condition.await();  condition.signal(); condition.signalAll();

    同一个对象中多个方法都加了synchronized关键字的时候,其中调用任意方法之后需等该方法执行完成才能调用其他方法,即同步的,阻塞的;


    线程调度的疑问:
    同一个对象中多个方法都使用同一把lock锁的时候,其中调用任意方法之后需等该方法执行完成才能调用其他方法吗?



  • 相关阅读:
    AE开发中实现Control中的各种图形工具的方法(转)
    ArcEngine打开本地数据库
    【ArcMap】
    【ArcCatalog】
    go guid 和uuid生成
    go select 的default
    go select 使得一个 goroutine 在多个通讯操作上等待。
    go channel
    go goroutine
    go io.Reader 接口
  • 原文地址:https://www.cnblogs.com/mjbenkyo/p/10745500.html
Copyright © 2020-2023  润新知