Object 中的wait和Thread中sleep的区别

摘要:
1、 差异1。Wait()来自Object类,而sleep来自Thread类。2.睡眠不能解除锁定。t、 sleep()不会让t进入睡眠状态。如果线程不在等待中,等待和通知必须在同步方法或块中。}newThread(newThread2()).start();

一、区别

1、wait()来自于Object类而sleep来自于Thread类

2、sleep没有释放锁,但是wait释放了锁(使得其他线程可以使用同步控制块或者方法锁)

3、wait,notify和notifyAll只能在同步控制方法或者同步控制块使用,而sleep能在各个地方使用

4、sleep必须捕获异常,但是其它wait不用

5、sleep让一个线程睡眠,等待一段时间后,自动醒来进入可运行状态,不会马上进入运行状态,因为线程调度机制恢复线程也需要时间。如果调用interrup方法,则会抛出InterruptedException。如果不捕获这个异常,那么会进入TERMINATED状态。如果捕获这个异常,那么可以在catch中继续执行后面的代码。

6、sleep是静态方法,只会让当前线程sleep,t.sleep()并不会让t进入sleep

如果线程并不处于wait,sleep,join状态时,调用interrupt方法线程不会抛出InterruptedException。

wait和notify必须在synchronized方法或者block中。

二、Code便于理解

package threads.waitandsleep;

/**
 * Created by adrian.wu on 2019/6/1.
 */
public class TestD {
    public static void main(String[] args) {
        new Thread(new Thread1()).start();

        try {
            Thread.sleep(5000);
        }catch (Exception e){
            e.printStackTrace();
        }
        new Thread(new Thread2()).start();
    }

    public static class Thread1 implements Runnable {
        @Override
        public void run() {
            synchronized (TestD.class) {
                System.out.println("enter thread1....");
                System.out.println("thread1 is waiting");
                try {
                    TestD.class.wait();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            System.out.println("thread1 is going on....");
            System.out.println("thread1 is over!!");
        }
    }

    public static class Thread2 implements Runnable {
        @Override
        public void run() {
            synchronized (TestD.class) {
                System.out.println("enter thread2....");
                System.out.println("thread2 is waiting");

                TestD.class.notify();
            }

            try {
                Thread.sleep(5000);
            }catch (Exception e){
                e.printStackTrace();
            }
            System.out.println("thread2 is going on....");
            System.out.println("thread2 is over!!");
        }
    }
}

结果:

enter thread1....
thread1 is waiting
enter thread2....
thread2 is waiting
thread1 is going on....
thread1 is over!!
thread2 is going on....
thread2 is over!!

解释:

wait()会释放锁,sleep()不会。也就是说wait 需要notify去唤醒。而sleep()并不会。只要当sleep时间到了就会自动执行下面的过程,但是会让出CPU线程。

免责声明:文章转载自《Object 中的wait和Thread中sleep的区别》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇explorer.exe进程简单介绍SurfaceView 与view区别详解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

VS调试技巧

下面有从浅入深的6个问题,您可以尝试回答一下 一个如下的语句for (int i = 0; i < 10; i++){if (i == 5)j = 5;},什么都写在一行,你怎么在j=5前面插入断点 在一个1000次的循环体内部设置断点,你希望当循环进行到900次后中断,怎么才能做到呢? 你有一个表达式在上面循环的某一次发生了变化,你想知道是哪一次...

Python subprocess.Popen communicate() 和wait()使用上的区别

之所以会纠结到这个问题上是因为发现在调用Popen的wait方法之后程序一直没有返回。google发现wait是有可能产生死锁的。为了把这个问题彻底弄清楚,搜索一些资料过来看看: 原文链接:http://blog.csdn.net/carolzhang8406/article/details/22286913 看到别人的例子: 今天遇到的一个问题。简单说就...

见到的一篇IOCP流程 自己用demo实现了一下, 简单照抄,改动了一点点

要分析的实例分为两个线程: 分别是主线程(MAIN),还有一个是创建的线程(ServerThread) 1.主函数完成初始化工作:   1.1: (主线程)HANDLE hCompletion = ::CreateIoCompletionPort(INVALID_HANDLE_VALUE, 0, 0, 0);    创建完成端口对象   1.2: (主线程...

浏览器工作原理和实践(三)——页面

《浏览器工作原理与实践》是极客时间上的一个浏览器学习系列,在学习之后特在此做记录和总结。 一、事件循环 消息队列是一种数据结构,可以存放要执行的任务。它符合队列“先进先出”的特点,也就是说要添加任务的话,添加到队列的尾部;要取出任务的话,从队列头部去取。 从上图可以看出,改造可以分为下面三个步骤: (1)添加一个消息队列; (2)IO 线程中产生的新任务...

判断当前线程所处的状态 (转)以及终止当前线程

 在C#中,线程对象Thread使用ThreadState属性指示线程状态,它是带Flags特性的枚举类型对象。    ThreadState 为线程定义了一组所有可能的执行状态。一旦线程被创建,它就至少处于其中一个状态中,直到终止。在公共语言运行时中创建的线程最初处于Unstarted状态中,而进入运行时的外部线程则已经处于Running状态中。通过调...

VC终止线程,ExitThread函数,Te r m i n a t e T h r e a d函数,撤消线程,详解

VC-终止线程,ExitThread函数,Te r m i n a t e T h r e a d函数,撤消线程,详解 6.5 终止线程的运行 若要终止线程的运行,可以使用下面的方法: •  线程函数返回(最好使用这种方法)。 •  通过调用E x i t T h r e a d函数,线程将自行撤消(最好不要使用这种方法)。 •  同一个进程或另一个进程中的...