zoukankan      html  css  js  c++  java
  • java多线程的理解

    java多线程的理解

     

    线程的5种状态:新建,就绪,运行,阻塞,死亡。

    Thread.sleep:线程  运行状态 转为  阻塞状态,(其它线程启动运行)

    Thread.yield:   线程 运行状态 转为 就绪状态,(同优先级线程启动运行)

    ThreadA.join:等待ThreadA执行完成。

    线程的两种方式:

    继承自Thread,实现Runnable.

    在线程中看是否有操作的同一对象的实例。如果有的话要考虑线程的同步和互斥。通俗点来说就是某个类的某个成员变量会有多个线程访问。

    线程的同步

    同步代码块:同步加锁的是对象,而不是代码。

    synchronized(Object A){

    }

    同步监视器是A,表示的是一个临界区。

    同步方法:

    synchronized Method1(){

    }

    synchronized Method2(){

    }

    同步锁:

    Lock lock = new ReentrantLock();

    public Mehtod1(){

    lock.lock();

    finally{

         lock.unlock();

    }

    }

    public Mehtod2(){

    lock.lock();

    finally{

         lock.unlock();

    }

    }

    同步监视器的释放:

    1.当前线程的同步方法或者同步代码块执行结束,当前线程即释放同步监视器。

    2.在同步方法或者同步代码块中出现了error或者exception的时候。

    3.当线程执行同步方法或者同步代码块时,程序执行了同步监视器对象的wait方法,则当前线程,并释放同步监视器。

    下面的情况不会释放同步监视器:

    1.当线程执行同步方法或者同步代码块时,程序调用Thread.Sleep,Thread.Yield方法。

    2.当线程执行同步方法或者同步代码块时,其他线程调用了该线程的suspend方法将该线程挂起。

    线程的通信:

    同步方法块或者同步方法使用object的wait,notify和notifyAll三个方法来进行线程的通信。

    如果是同步方法块synchronized(Object a):则在代码中要使用a.wait,a.notify,a.notifyAll;

    如果使用的是同步方法synchronized methodA(),则同步监视器是this对象,可以直接在代码中使用wait,notify和notifyAll方法。

    wait:导致当前的线程等待,并且释放当前的同步监视器。直到其他线程调用该同步监视器的notify方法和notifyall方法。

    notify:唤醒在此监视器上等待的单个线程,但是选择是任意的。

    notifyAll:唤醒在同步监视器上等待的所有线程。

  • 相关阅读:
    android: 在fragment中添加actionbar, menu
    Android Context
    Android 在fragment中使用tabhost
    Android 菜单
    centos8 防火墙
    DHCP 原理
    阿里云服务器 linux下载 jdk
    java long值转成时间格式
    Window 中杀死指定端口 cmd 命令行 taskkill
    redis 安装
  • 原文地址:https://www.cnblogs.com/isoftware/p/3780863.html
Copyright © 2011-2022 走看看