1. 스레드의 상태는 무엇인가요?
스레드에는 일반적으로 생성됨, 준비됨, 실행 중, 차단됨, 종료됨의 5가지 상태가 있습니다.
1. 생성 상태
스레드 개체를 생성할 때 개체의 시작 메서드가 호출되지 않습니다. 이는 스레드가 생성 상태에 있음을 의미합니다.
2. 준비 상태
스레드 객체의 시작 메소드가 호출되면 스레드는 준비 상태로 진입하지만 이때 스레드 스케줄러는 해당 스레드를 현재 스레드로 설정하지 않았으며 준비 상태입니다. 이 시간에. 스레드가 실행된 후 대기 또는 절전 모드에서 돌아온 후에도 준비 상태가 됩니다.
3. 실행 상태
스레드 스케줄러는 준비 상태의 스레드를 현재 스레드로 설정하고 이때 스레드는 실행 상태로 들어가 실행 함수에서 코드를 실행하기 시작합니다.
4. 차단 상태
스레드가 실행 중이면 일반적으로 실행을 계속하기 전에 특정 시간(예: 특정 리소스가 준비됨)이 발생할 때까지 기다리기 위해 일시 중지됩니다. 절전, 일시 중단, 대기 및 기타 방법으로 인해 스레드 차단이 발생할 수 있습니다.
5. 사망 상태
스레드의 실행 메소드가 종료되거나 중지 메소드가 호출되면 스레드가 종료됩니다. 죽은 스레드의 경우 더 이상 시작 메소드를 사용하여 스레드를 준비할 수 없습니다.
(추천 관련 동영상 튜토리얼: java video)
2. sleep()과 wait()의 차이점은 무엇인가요?
1.sleep(): 메서드는 스레드 클래스(Thread)의 정적 메서드로, 호출 스레드가 절전 상태에 들어갈 수 있게 하고 절전 시간이 끝나면 다른 스레드에 실행 기회를 제공합니다. 준비 상태이며 다른 스레드와 경쟁합니다. sleep()은 정적 메소드이므로 객체의 기계 잠금을 변경할 수 없습니다. 동기화된 블록에서 sleep() 메소드가 호출되면 스레드가 절전 모드로 전환되더라도 객체의 기계 잠금은 해제되지 않으며 다른 스레드는 여전히 변경할 수 없습니다. 이 객체에 접근하세요.
2. wait(): wait()는 Object 클래스의 메소드로, 스레드가 wait 메소드를 실행하면 해당 객체와 관련된 대기 풀에 들어가고 동시에 객체의 기계 잠금을 해제하므로 다른 스레드가 액세스하려면 통지 및 통지All 메소드를 통해 대기 중인 스레드를 깨울 수 있습니다.
3.notify()와 informAll()의 차이점은 무엇인가요?
스레드가 개체의 wait() 메서드를 호출하면 스레드는 개체의 대기 풀에 있게 되며 대기 풀의 스레드는 개체 잠금을 놓고 경쟁하지 않습니다.
스레드가 객체의 informAll() 메서드(모든 대기 스레드 깨우기) 또는 inform() 메서드(무작위로 하나의 대기 스레드만 깨우기)를 호출하면 깨어난 스레드는 객체의 잠금 풀에 들어가고 잠금 풀 스레드는 개체에서 개체 잠금을 놓고 경쟁합니다. 즉, 통지를 호출한 후 하나의 스레드만 대기 풀에서 잠금 풀에 들어가고, informAll은 개체 대기 풀의 모든 스레드를 잠금 풀로 이동하여 잠금 경쟁을 기다립니다.
우선순위가 높은 스레드는 객체 잠금을 놓고 경쟁할 가능성이 높습니다. 스레드가 객체 잠금을 놓고 경쟁하지 않으면 스레드가 wait() 메서드를 다시 호출할 때만 잠금 풀에 남아 있게 됩니다. 잠금 풀로 이동합니다. 객체 잠금을 위해 경쟁하는 스레드는 동기화된 코드 블록이 실행될 때까지 계속 실행되며, 이때 잠금 풀에 있는 스레드는 객체 잠금을 위해 계속 경쟁하게 됩니다.
4. 스레드 run()과 start()의 차이점은 무엇인가요?
각 스레드는 특정 Thread 객체에 해당하는 run() 메서드를 통해 작업을 완료합니다. run() 메서드를 스레드 본문이라고 합니다. Thread 클래스의 start() 메서드를 호출하여 스레드를 시작합니다.
start() 스레드를 시작하는 메서드로 진정한 멀티 스레드 작업을 실현합니다. 이때 실행 메서드 본문 코드가 실행될 때까지 기다릴 필요가 없으며 이 시점에서 다음 코드를 직접 계속 실행할 수 있습니다. 스레드는 준비 상태이고 실행 중이 아닙니다. 그런 다음 이 Thread 클래스를 통해 run() 메서드를 호출하여 실행 상태를 완료합니다. 여기서 run() 메서드는 실행될 스레드의 내용을 포함하는 스레드 본문이라고 합니다. Run 메서드가 종료되고 스레드가 종료됩니다. 그런 다음 CPU는 다른 스레드를 예약합니다.
이 스레드에는 run() 메서드가 있습니다. 이는 멀티 스레드가 아닌 스레드의 함수일 뿐입니다. run()을 직접 호출하는 것은 실제로 일반 함수를 호출하는 것과 동일합니다. run() 메서드를 직접 사용하는 경우에는 다음 코드를 실행하기 전에 run() 메서드가 실행을 완료할 때까지 기다려야 합니다. 여전히 하나의 실행 경로만 있고 스레드가 전혀 없기 때문에 다중 스레드 실행 중에는 run() 메서드 대신 start() 메서드를 사용해야 합니다.
(추천 튜토리얼: java 입문 프로그램)
5. 스레드 풀을 생성하는 방법은 무엇인가요?
1. newFixedThreadPool(int nThreads)
작업이 제출될 때마다 최대 스레드 풀 수에 도달할 때까지 스레드가 생성됩니다. 이때 스레드 크기는 더 이상 생성되지 않습니다. 스레드가 발생하는 경우 예상치 못한 오류로 종료되면 스레드 풀에 새 스레드가 채워집니다.
2.newCachedThreadPool()
캐시 가능한 스레드 풀을 생성합니다. 스레드 풀의 크기가 처리 요구량을 초과하면 유휴 스레드가 자동으로 재활용됩니다. 수요가 증가하면 새 스레드가 자동으로 추가될 수 있습니다. 스레드 풀의 크기에는 제한이 없습니다.
3. newSingleThreadExecutor()
이 스레드는 작업을 수행하기 위해 단일 작업자 스레드를 생성합니다. 이 스레드를 대체하기 위해 새 스레드가 생성됩니다. 작업에 따라 실행됩니다. 대기열의 시퀀스는 순차적으로 실행됩니다.
4. newScheduledThreadPool(int corePoolSize)
Timer와 유사하게 고정 길이 스레드 풀을 생성하고 지연되거나 예약된 방식으로 작업을 실행합니다.
더 많은 면접 질문은 java 면접 질문 칼럼을 주목해주세요.
위 내용은 2020 새로운 Java 면접 질문 - 멀티스레딩 (2)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!