线程 同步 未完待续

Android 多线程

线程的三种实现方式
1.继承 Thread  2.实现Runnable接口  3.实现Callable接口
    run 无返回值  call 有返回值
    run不能抛出异常  call能抛出异常
    执行Call可以拿到一个Future对象,通过Future对象可以了解任务情况,可以取消任务的执行
    
线程状态    
    新建,就绪,运行,阻塞,死亡
    
 方法:   有几句看不明白  ,懂了再改
    1.在Java中使用了同步Synchronize(Object),那么该Object会有属于自己的监视锁
    2.拥有monitor的是线程。同时只有一个线程可以获取某个对象的monitor
    3.一个线程通过调用某个对象的wait方法释放该对象的minitor并进入休眠状态
      直到其他线程获取了被该线程释放的monitor并调用该对象的notify或者notifyAll后再次竞争获取该对象的monitor
    4.只有拥有该对象monitor的线程才可以调用该对象的notify和notifyAll方法
    
      如果没有该对象monitor的线程调用了该对象的notify或notifyAll方法将会抛出
            Java.lang.illegalMonitorStateException
    

    
    wait():首先,调用了wait之后会引起当前线程处于等待状态
              其次,每个线程必须持有该对象的monitor,如果在当前线程调用了wait()方法后,该线程就会释放monitor的持有对象并让自己处等待状态。
              如果想唤醒一个正在等待的线程,那么需要开启一个线程通过notify()或者notifyAll()方法去通知正在等待的线程获取monitor对象
              如此,该线程即可打破等待的状态继续执行
    sleep():使一个线程处于睡眠状态,是一个静态方法,调用此方法要捕捉Interrupted异常,醒来后进入runnable状态,等待JVM调度
    
    notify():使一个等待状态的线程唤醒,注意并不能确切唤醒等待状态的线程,由JVM决定且不按优先级。
    join():使一个线程中断,IO完成会回到Runnable,等待JVM调度、会抢先执行线程
    Synchronized():使Running状态的线程加同步锁使其进入(Lock blocked pool),同步锁释放即可回到运行状态
            释放同步锁:
                1.当前线程的同步方法 ,代码块执行结束的。
                2.当前线程在同步方法,同步代码块中遇到Break,return是释放
                3.出现未处理的error 或者Exception导致异常结束释放
                4.程序执行了同步对象wait方法,当前线程暂停,释放
            
    yield():让出运行机会给相同优先级的其他线程
    
一些概念:
        1.并行。多个Cpu实例或多台机器同时执行一段代码,是真正的同时。
        2.并发,通过Cpu调度算法,让用户看上去同时执行,实际上从cpu操作层面不是真正的同时。
        3.线程安全。指在并发的情况下,该代码经过多线程使用,线程的调度顺序不影响任何结果。线程不安全就意味着线程的调度顺序会影响最终结果。
            比如某段代码不加事务去并发访问。
        4.线程同步。指的是通过人为的控制和调度,保证共享资源的多线程访问成为线程安全
            来保证结果的正确,如某段代码加入Synchronized关键字。线程安全的优先级高于性能优化。
        5.原子性。一个操作或者一系列操作,要么全部执行要么全部不执行,数据库中的事务就是个典型的原子操作。
        6.可见性。当一个线程修改了共享属性的值,其他线程能立刻看到共享属性值的更改,    
    
    

                


















猜你喜欢

转载自blog.csdn.net/flypig_vip/article/details/79464599
今日推荐