💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
欢迎关注我的公众号: ![我的公众号](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20190606104746.png) ## sleep() 方法 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行) sleep()使当前线程进入停滞状态(阻塞当前线程),让出CUP的使用、目的是不让当前线程独自霸占该进程所获的CPU资源,以留一定时间给其他线程执行的机会; sleep()是Thread类的Static(静态)的方法;因此他不能改变对象的机锁,所以当在一个Synchronized块中调用Sleep()方法是,线程虽然休眠了,但是对象的机锁并木有被释放,其他线程无法访问这个对象(即使睡着也持有对象锁)。 在sleep()休眠时间期满后,该线程不一定会立即执行,这是因为其它线程可能正在运行而且没有被调度为放弃执行,除非此线程具有更高的优先级。 ## wait() 方法 暂停线程,释放 cpu 控制权,同时释放对象锁的控制 1. wait()方法是Object类里的方法; 2. 当一个线程执行到wait()方法时,它就进入到一个和该对象相关的等待池中,同时失去(释放)了对象的机锁(暂时失去机锁,wait(long timeout)超时时间到后还需要返还对象锁);其他线程可以访问; 3. wait()使用notify或者notifyAlll或者指定睡眠时间来唤醒当前等待池中的线程。 4. wiat()必须放在synchronized block中,否则会在program runtime时扔出”java.lang.IllegalMonitorStateException“异常。 ## yield() 方法 暂停当前正在执行的线程对象,并执行其他线程 yield() 应该做的是让当前运行线程回到可运行状态(就绪状态),以允许具有相同优先级的其他线程获得运行机会。因此,使用 yield() 的目的是让相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证 yield() 达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。 **yield() 只是给相同优先级的线程让出 cpu 资源,如果没有相同优先级的线程,那么它还是会得到执行** ## sleep 和 wait 的对比 1. wait只能在同步(synchronize)环境中被调用,而sleep不需要。 2. 进入wait状态的线程能够被notify和notifyAll线程唤醒,但是进入sleeping状态的线程不能被notify方法唤醒。 3. wait通常有条件地执行,线程会一直处于wait状态,直到某个条件变为真。但是sleep仅仅让你的线程进入睡眠状态。 4. wait方法在进入wait状态的时候会释放对象的锁,但是sleep方法不会。 5. wait方法是针对一个被同步代码块加锁的对象,而sleep是针对一个线程。