Locksupport는 잠금 및 기타 동기화 클래스를 생성하는 데 사용되는 기본 스레드 차단 원시입니다.
Locksupport에서 Park () 및 Unpark ()의 함수는 각각 스레드와 블록 스레드를 차단하는 것입니다. Park () 및 Unpark ()는 "Thread.suspend 및 Thread.Resume"문제로 인한 교착 상태를 만나지 않습니다.
Park () 및 unpark ()는 권한이 있기 때문입니다. Park ()와 unpark ()를 시도하는 다른 스레드 사이의 경쟁은 활성화됩니다.
기본 사용
Locksupport는 바이너리 세마포어와 매우 유사합니다 (1 개의 라이센스 만 사용할 수 있음). 이 라이센스가 점유되지 않은 경우 현재 스레드는 라이센스를 얻고 계속 실행합니다. 라이센스가 점유 된 경우 현재 스레드가 차단되어 라이센스를 얻기 위해 대기합니다.
public static void main (String [] args) {locksupport.park (); System.out.println ( "블록.");}코드를 실행하면 기본 스레드가 항상 차단되고 있음을 알 수 있습니다. 라이센스는 기본적으로 점유되므로 Park ()를 호출 할 때 라이센스를 얻을 수 없으므로 차단 상태로 들어갑니다.
다음 코드 : 먼저 라이센스를 릴리스 한 다음 라이센스를 얻으면 기본 스레드가 정상적으로 종료 될 수 있습니다. Locksupport 라이센스의 획득 및 릴리스는 일반적으로 해당합니다. 여러 번 버려지면 한 번만 주차하면 아무런 문제가 없습니다. 결과적으로 라이센스는 사용 가능한 상태에 있습니다.
public static void main (String [] args) {Thread Thread = Thread.currentThread (); Locksupport.unpark (Thread); // 라이센스 lecupport.park (); // 라이센스 시스템을 얻습니다. out.out.println ( "b");}Locksupport는 재진입하지 않습니다. 스레드가 locksupport .park ()를 연속으로 두 번 호출하면 스레드가 확실히 차단됩니다.
public static void main (string [] args)은 예외 {스레드 스레드 = thread.currentthread (); Locksupport.unpark (스레드); System.out.println ( "A"); Locksupport.park (); System.out.println ( "B"); Locksupport.park (); System.out.println ( "C");}이 코드는 A와 B를 인쇄하지만 C를 인쇄하지는 않지만 두 번째로 Park를 호출 할 때 스레드가 권한을 얻을 수 없기 때문에 C 인쇄되지 않습니다.
Locksupport의 해당 인터럽트의 응답을 살펴 보겠습니다.
public static void t2 ()는 예외를 {thread t = new Thread (new runnable () {private int count = 0; @override public void run () {long start = system.currenttimeMillis (); long end = 0; while (end -start) {count ++; end = system.currentTimeMillis (); + count); /leopsupport.park.out.println이 허가를받을 때까지 기다렸다. t.start (); Thread.sleep (2000); // 인터럽트 스레드 t.interrupt (); System.out.println ( "Main Over");}스레드가 스레드를 인쇄합니다. 즉, 공원에 전화하여 스레드 블록이 있으면 인터럽트 요청에 응답 할 수 있지만 (인터럽트 상태는 TRUE로 설정되어 있음) 인터럽트 픽스를 던지지 않습니다.
Locksupport 기능 목록
// 가장 최근에 차단되지 않은 공원 메소드 호출에 제공된 차단 객체를 반환하고 호출이 차단되지 않은 경우 NULL을 반환합니다. static 객체 getBlocker (스레드 t) // 스레드 스케줄링의 경우 라이센스를 사용할 수없는 한 현재 스레드를 비활성화합니다. static void park () // 스레드 스케줄링의 경우 라이센스를 사용할 수 있기 전에 현재 스레드를 비활성화하십시오. STATIC VOID PARK (객체 차단기) // 스레드 스케줄링의 경우 라이센스를 사용할 수없는 한 지정된 대기 시간을 최대로 기다리십시오. STATIC VOID PARKNANOS (LONG NANOS) // 스레드 스케줄링의 경우 라이센스를 사용할 수 있기 전에 현재 스레드를 비활성화하고 지정된 대기 시간을 최대로 기다립니다. 정적 무효 파크 나노 (객체 차단기, 긴 나노) // 스레드 스케줄링의 경우 라이센스를 사용할 수없는 한 지정된 시간 제한 전에 현재 스레드가 비활성화됩니다. STATIC VOID PARKINTIL (긴 마감일) // 스레드 스케줄링의 경우 라이센스를 사용할 수없는 한 지정된 시간 제한 전에 현재 스레드가 비활성화됩니다. static void parkuntil (객체 차단기, 긴 마감일) // 주어진 스레드의 라이센스를 아직 사용할 수없는 경우 사용할 수 있도록합니다. 정적 void unpark (스레드 스레드)
Locksupport 예제
아래의 "예제 1"과 "예제 2"를 비교하면 Locksupport 사용에 대한 명확한 이해를 제공 할 수 있습니다.
예 1
공개 클래스 WaitTest1 {public static void main (String [] args) {Threada ta = new Threada ( "ta"); Synchronized (TA) {// Synchronized (TA) Try {System.out.println (Thread.CurrentThread (). getName ()+"Start TA")을 통해 "Object TA의 동기화 잠금"을 가져옵니다. ta.start (); System.out.println (thread.currentthread (). getName ()+"block"); // 메인 스레드는 ta.wait ()를 기다리고 있습니다. system.out.println (thread.currentthread (). getName ()+"계속"); } catch (InterruptedException e) {e.printstacktrace (); }}} static class streada는 스레드 {public threada (String name) {super (name); } public void run () {synchronized (this) {// "get get"synchronized (this) system.out.println을 통해 "현재 객체의 동기화 잠금"(thread.currentthread (). getName ()+"wakup 기타"); notify (); // 깨우기 "현재 객체의 대기 스레드"}}}} 예 2
import java.util.concurrent.locks.locksupport; public class locksupporttest1 {private static stride mainthread; public static void main (string [] args) {Threada ta = new Threada ( "ta"); // 메인 스레드를 가져옵니다. mainthread = thread.currentthread (); system.out.println (thread.currentthread (). getName ()+"시작 ta"); ta.start (); System.out.println (thread.currentthread (). getName ()+"block"); // 메인 스레드는 leksupport.park (mainthread)를 차단합니다. system.out.println (thread.currentthread (). getName ()+"계속"); } static class streada는 stread {public threada (문자열 이름) {super (name); } public void run () {system.out.println (Thread.currentThread (). getName ()+"wakup 기타"); // "메인 스레드"Locksupport.unpark (Mainthread)를 깨우십시오. }}} 실행 결과 :
메인 스타트 타인 블록 타는 다른 사람들이 계속됩니다
설명 : 공원과 대기의 차이. 대기 차단 스레드를 대기하기 전에 동기화 잠금을 동기화하여 얻어야합니다.