Java使用sleep方法暫停線程Thread
為什么要用sleep,主要是為了暫停當(dāng)前線程,把cpu片段讓出給其他線程,減緩當(dāng)前線程的執(zhí)行。
方法的定義:
public static void sleep(long millis);
public static native void sleep(long millis) throws InterruptedException;
通過定義可以看出sleep方法是本地方法,通過系統(tǒng)調(diào)用暫停當(dāng)前線程,而不是java自己實(shí)現(xiàn)的。
sleep還有一個(gè)重載的方法:
public static void sleep(long millis, int nanos)
實(shí)現(xiàn)如下:
public static void sleep(long millis, int nanos) throws InterruptedException { if (millis < 0) { throw new IllegalArgumentException("timeout value is negative"); } if (nanos < 0 || nanos > 999999) { throw new IllegalArgumentException( "nanosecond timeout value out of range"); } if (nanos >= 500000 || (nanos != 0 && millis == 0)) { millis++; } sleep(millis); }
從表面現(xiàn)象上來看,這個(gè)方法支持納秒級(jí)別的暫定,但是內(nèi)部的實(shí)現(xiàn)最終還是毫秒級(jí)別的執(zhí)行,以500 000納秒作為分割,大于這個(gè)值時(shí),線程在millis的基礎(chǔ)上多sleep 1毫秒,否則還是sleep millis毫秒,當(dāng)然如果millis為0時(shí),會(huì)sleep 1毫秒。
寫個(gè)簡(jiǎn)單的demo來看線程的執(zhí)行:
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class ThreadTest implements Runnable{ public static void main(String[] args) throws InterruptedException { Thread test1 = new Thread(new ThreadTest()); Thread test2 = new Thread(new ThreadTest()); test1.start(); test2.start(); test1.sleep(5000); } @Override public void run() { for (int i = 0; i < 5; i++){ System.out.println(i); } } }
執(zhí)行結(jié)果:
0 1 2 3 4 0 1 2 3 4 //此處會(huì)暫停5秒 end
值得注意的是:
- 1. sleep是幫助其他線程獲得運(yùn)行機(jī)會(huì)的最好方法,但是如果當(dāng)前線程獲取到的有鎖,sleep不會(huì)讓出鎖。
- 2. 線程睡眠到期自動(dòng)蘇醒,并返回到可運(yùn)行狀態(tài)(就緒),不是運(yùn)行狀態(tài)。
- 3. 優(yōu)先線程的調(diào)用,現(xiàn)在蘇醒之后,并不會(huì)里面執(zhí)行,所以sleep()中指定的時(shí)間是線程不會(huì)運(yùn)行的最短時(shí)間,sleep方法不能作為精確的時(shí)間控制。
- 3、sleep()是靜態(tài)方法,只能控制當(dāng)前正在運(yùn)行的線程(示例就是這樣調(diào)用的,因?yàn)轭悓?duì)象可以調(diào)用類的靜態(tài)方法)。
到此這篇關(guān)于Java使用sleep方法暫停線程Thread的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
基于idea把maven工程轉(zhuǎn)換為web項(xiàng)目
這篇文章主要介紹了基于idea把maven工程轉(zhuǎn)換為web項(xiàng)目,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04Java中將一個(gè)列表拆分為多個(gè)較小列表的三種不同方法
有時(shí)候我們需要將大集合按指定的數(shù)量分割成若干個(gè)小集合,這篇文章主要給大家介紹了關(guān)于Java中將一個(gè)列表拆分為多個(gè)較小列表的三種不同方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-09-09Python中scrapy框架的ltem和scrapy.Request詳解
這篇文章主要介紹了Python中scrapy框架的ltem和scrapy.Request詳解,Item是保存爬取數(shù)據(jù)的容器,它的使用方法和字典類似,不過,相比字典,Item提供了額外的保護(hù)機(jī)制,可以避免拼寫錯(cuò)誤或者定義字段錯(cuò)誤,需要的朋友可以參考下2023-09-09java課程設(shè)計(jì)做一個(gè)多人聊天室(socket+多線程)
這篇文章主要介紹了我的java課程設(shè)計(jì)一個(gè)多人聊天室(socket+多線程)本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08SpringBoot前后端分離實(shí)現(xiàn)驗(yàn)證碼操作
驗(yàn)證碼的功能是防止非法用戶惡意去訪問登錄接口而設(shè)置的一個(gè)功能,今天我們就來看看在前后端分離的項(xiàng)目中,SpringBoot是如何提供服務(wù)的2022-05-05Java 多線程等待優(yōu)雅的實(shí)現(xiàn)方式之Phaser同步屏障
在JAVA 1.7引入了一個(gè)新的并發(fā)API:Phaser,一個(gè)可重用的同步barrier。在此前,JAVA已經(jīng)有CyclicBarrier、CountDownLatch這兩種同步barrier,但是Phaser更加靈活,而且側(cè)重于 重用2021-11-11