terminated: 终止状态, 当前线程执行完毕
这里介绍多线程的几个状态, 主要是想大家看下, 在这几个状态的转化中 wait 和 sleep 的作用.
通过上面的图可以看到
wait 使线程从 Running 到 Waitingsleep 使线程从 Running 到 timed_waiting: 超时等待状态, 时间一到自动变回 Running 状态可以看出 wait 和 sleep 都可以使线程中止, 但是也存在许多不同, 下面就逐一来看下 wait 和 sleep 的不同之处
一, sleep 是 Thread 的方法, wait 是 Object 的方法
sleep 的源码
可以看到 sleep 在 Thread 类中, 并且是 Thread 的一个静态本地方法, 所以平时我们调用 sleep 的时候就 Thread.sleep() 这样就可以进行调用了.
wait 源码
可以看到 wait 方法在 Object 类中, 因为 java 中所有的类都是继承自 object 的, 所以所有类都可以调用 wait 方法, 这是一个 final 的方法, 同时不是一个静态方法, 所以调用该方法需要先实例化一个 Object 对象才可以
二, sleep 不会去释放锁, 但是 wait 会释放这个锁, 并把这个 wait 的线程加入到这个锁的等待队列中去
废话少说看例子!
sleep 不会释放锁
通过输出结果我们可以看到, t1 和 t2 这两个线程是顺序输出的, 因为 sleep 不会释放锁, 必须等 sleep 结束了才会释放锁, 下一个线程才能去执行.
wait 会释放锁
通过这个输出结果可以看到 t1 和 t2 这两个线程几乎是同时执行的, 这是因为 wait 在中止线程的时候是直接把线程放到等待队列中的, 会直接释放锁
三, 使用 wait 必须要定义一个 synchronized, 而 sleep 不需要
废话少说, 看例子!
看输出结果可以发现, 会报一个非法的监视器错误, 这就是因为 wait 必须要在 synchronized 修饰的语句块或者方法和类中
四, 使用 sleep 不需要被唤醒, 但是 wait 是需要 notify() 或者 notifyAll() 去唤醒的, 除了 wait(1000) 这种形式
多线程的状态变化还是比较复杂的, 在这其中 wait 和 sleep 都能起到使线程中止的目的, 但是它俩有很多区别, 在实际的使用中要根据具体情况来定. 同时 "wait 和 sleep 的区别" 是很多面试官都喜欢问的, 希望看完这篇文章对大家有帮助.
来源: http://www.bubuko.com/infodetail-3557559.html