자바 스 레 드 학습 기록(6)--sleep
23116 단어 자바
역할:스 레 드 를 예상 한 시간 에 실행 시 키 고 싶 습 니 다.다른 때 는 CPU 자원 을 사용 하지 마 십시오.다음 에 호출 될 때 까지 CPU 자원 을 사용 합 니 다.특징:
sleep 방법 은 자 물 쇠 를 풀 지 않 습 니 다
public class SleepDontReleaseMonitor implements Runnable {
public static void main(String[] args) {
SleepDontReleaseMonitor sleepDontReleaseMonitor = new SleepDontReleaseMonitor();
new Thread(sleepDontReleaseMonitor).start();
new Thread(sleepDontReleaseMonitor).start();
}
@Override
public void run() {
syn();
}
private synchronized void syn() {
System.out.println(Thread.currentThread().getName() + " monitor");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " ");
}
}
출력 에서 볼 수 있 듯 이 sleep 이 끝 난 후에 야 두 번 째 스 레 드 를 계속 실행 할 수 있 습 니 다.
Thread-0 monitor
Thread-0
Thread-1 monitor
Thread-1
sleep 에서 lock 을 풀 지 않 습 니 다(lock 은 수 동 으로 풀 어야 합 니 다)
public class SleepDontReleaseLock implements Runnable {
//
private static final Lock lock = new ReentrantLock();
@Override
public void run() {
lock.lock();
System.out.println(Thread.currentThread().getName() + " ");
try {
Thread.sleep(5000);
System.out.println(Thread.currentThread().getName() + " ");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public static void main(String[] args) {
SleepDontReleaseLock sleepDontReleaseLock = new SleepDontReleaseLock();
new Thread(sleepDontReleaseLock).start();
new Thread(sleepDontReleaseLock).start();
}
}
출력 에서 볼 때 스 레 드 도 sleep 가 끝 날 때 까지 기 다 려 야 자 물 쇠 를 풀 수 있 고 다른 스 레 드 는 자 물 쇠 를 얻 을 수 있 습 니 다.
Thread-0
Thread-0
Thread-1
Thread-1
sleep 응답 중단
현재 시간 을 1 초 간격 으로 출력,중단,관찰
public class SleepInterrupted implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(new Date());
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
System.out.println(" !");
e.printStackTrace();
}
}
}
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(new SleepInterrupted());
thread.start();
Thread.sleep(6500);
thread.interrupt();
}
}
출력
Thu May 21 21:19:12 CST 2020
Thu May 21 21:19:13 CST 2020
Thu May 21 21:19:14 CST 2020
Thu May 21 21:19:15 CST 2020
Thu May 21 21:19:16 CST 2020
Thu May 21 21:19:17 CST 2020
Thu May 21 21:19:18 CST 2020
!
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at java.lang.Thread.sleep(Thread.java:340)
at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)
at threadcoreknowledge.threadobjectclasscommonmethods.SleepInterrupted.run(SleepInterrupted.java:19)
at java.lang.Thread.run(Thread.java:748)
Thu May 21 21:19:18 CST 2020
Thu May 21 21:19:19 CST 2020
Thu May 21 21:19:20 CST 2020
출력 에서 중단 되 었 을 때 던 진 이상 을 뚜렷하게 볼 수 있 습 니 다.여 기 는**TimeUnit.SECONDS.sleep(1)을 추천 합 니 다.**방식 은 생산 환경 에서 3 시간 24 분 50 초 와 같은 상황 이 발생 할 수 있 기 때문에 Thead.sleep()을 사용 하면 밀리초 가 필요 합 니 다.우 리 는 시간 을 전환 해 야 합 니 다.추천 하 는 방식 을 사용 하면 소 개 를 하 겠 습 니 다.또한 Thread.sleep()방법 에 서 는 인자 가 0 보다 적 으 면 이상 을 던 지고 첫 번 째 방법 은 무시 합 니 다.
TimeUnit.HOURS.sleep(3);
TimeUnit.MINUTES.sleep(24);
TimeUnit.SECONDS.sleep(1);
총결산
sleep 방법 은 스 레 드 를 Waiting 상태 로 들 어가 게 하고 CPU 자원 을 차지 하지 않 지만 자 물 쇠 를 풀 지 않 습 니 다.정 해진 시간 후에 실 행 될 때 까지 휴면 기간 이 중단 되면 이상 을 던 지고 중단 상 태 를 제거 합 니 다.
wait/notify,sleep 공통점
같다
차이 점
4.567917.wait/notify 는 동기 코드 블록 에 넣 어야 합 니 다.sleep 는 필요 없습니다.wait/notify 는 서로 협조 해 야 합 니 다.스 레 드 가 더욱 안전 하고 잠 금 해제 와 영구적 인 기다 림 을 방지 합 니 다
wait/notify 는 자 물 쇠 를 풀 고 sleep 는 풀 지 않 습 니 다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.