关于线程和多线程

首先Object中的方法:wait()、notify()、notifyAll()。java

Thread中的方法:start()、run()、sleep()、yield()、interrupt()方法。源码分析

wait和notify都须要在同步代码块中使用。this

java 线程状态转换图:spa

新建一个线程-start()->可运行-run()->运行-->死亡线程

1.若是一个运行的线程sleep(),2.t2.join()方法,3.等待用户输入,三种状况下线程会进入阻塞状态。对象

运行的线程会试图获取锁,synchronized(),线程获取到锁,就进入可运行状态,若是获取不到锁,就进入等待队列中等待;队列

若是线程调用wait()方法,JVM会把线程放入等待队列中,等待被其余进程唤醒(notify());进程

若是线程调用了对象的 wait()方法,那么线程便会处于该对象的等待池中,等待池中的线程不会去竞争该对象的锁。同步

当有线程调用了对象的 notifyAll()方法(唤醒全部 wait 线程)或 notify()方法(只随机唤醒一个 wait 线程),被唤醒的的线程便会进入该对象的锁池中,锁池中的线程会去竞争该对象锁。源码

TODO: 结合源码分析。

总结点:1.sleep与wait的区别:

sleep()不会释放锁,wait会释放锁,等别的进程调用notify的时候,该阻塞的进程可能会从新得到锁;

sleep是Thread的方法,wait是Object的方法。sleep不会引发锁的变化。

join()方法具备使线程排队运行的做用,当前线程等待。jion(long )中的参数能够指定等待时间。

join()方法的内部是使用wait实现的,因此join会释放锁。

public final synchronized void join(long var1) throws InterruptedException {
    long var3 = System.currentTimeMillis();
    long var5 = 0L;
    if(var1 < 0L) {
        throw new IllegalArgumentException("timeout value is negative");
    } else {
        if(var1 == 0L) {
            while(this.isAlive()) {
                this.wait(0L);
            }
        } else {
            while(this.isAlive()) {
                long var7 = var1 - var5;
                if(var7 <= 0L) {
                    break;
                }

                this.wait(var7);
                var5 = System.currentTimeMillis() - var3;
            }
        }

    }
}
相关文章
相关标签/搜索