1. 스레드와 프로세스
1. 스레드와 프로세스의 차이점은 무엇입니까?
스레드는 실행 중에 프로그램 코드를 실행할 수있는 실행 장치를 나타냅니다. Java 언어에서 스레드에는 4 개의 상태가 있습니다 : 실행, 준비, 일시 중단 및 종료.
프로세스는 실행중인 프로그램을 나타냅니다. 스레드는해야 할 일이있을 때 가벼운 프로세스가됩니다. 그들은 프로그램 실행의 가장 작은 단위를 가지고 있습니다. 프로세스에는 여러 스레드가있을 수 있습니다. 각 스레드는 프로그램의 내부 전력 공간 (코드 세그먼트, 데이터 세그먼트 및 힙 공간) 및 일부 프로세스 레벨 리소스 (예 : 열린 파일)를 공유하지만 각 스레드에는 자체 공간이 있습니다.
2. 왜 다중 프로세스를 사용합니까 ? <br /> 주로 운영 체제 수준에 다음과 같은 측면이 있습니다.
- 멀티 스레딩을 사용하면 프로그램의 응답 시간이 줄어들 수 있습니다. 작업이 시간이 많이 걸리거나 오랫동안 대기중인 경우 프로그램은 마우스 및 키보드와 같은 작업에 응답하지 않습니다. 멀티 스레딩을 사용한 후,이 시간 소모 스레드는 실행을 위해 별도의 스레드에 할당 될 수 있으므로 프로그램이 더 나은 상호 작용성을 만들 수 있습니다.
- 스레드 생성 및 스위치 오버 헤드는 프로세스에 비해 저렴하지만 멀티 스레딩은 데이터 공유가 매우 효율적입니다.
-멀티 CPU 또는 멀티 코어 컴퓨터는 멀티 스레드를 실행할 수 있습니다. 단일 프로세스가 사용되면 컴퓨터 자원을 재사용하지 않아 자원이 많이 낭비됩니다. 멀티 -CPU 컴퓨터에서 멀티 스레딩을 사용하면 CPU 사용이 향상 될 수 있습니다.
- 멀티 스레딩을 사용하면 프로그램의 구조를 단순화하고 이해하고 유지 관리하기 쉽습니다.
2. 스레드 생성 <br /> 일반적으로 멀티 스레딩 구현을위한 세 가지 방법이 있으며, 처음 두 가지는 가장 일반적으로 사용되는 방법입니다.
1. 스레드 클래스를 상속하고 run () 메소드를 재정의합니다.
스레드는 본질적으로 실행 가능한 인터페이스를 구현하는 인스턴스입니다. start () 메소드를 호출 한 후에는 다중 스레드 코드를 즉시 실행하지 않고 스레드를 실행한다는 점에 유의해야합니다. 다중 스레드 코드를 실행할 때 운영 체제에 의해 결정됩니다.
주요 단계는 다음과 같습니다.
(1) 스레드 클래스의 서브 클래스를 정의하고 클래스의 실행 방법을 무시하십시오. 실행 메소드의 메소드 본문은 스레드가 완료하려는 작업을 나타냅니다. 따라서 run () 메소드를 실행 본체라고합니다.
(2) 스레드 서브 클래스의 인스턴스를 만듭니다. 즉, 스레드 객체를 만듭니다.
(3) 스레드 객체의 start () 메소드를 호출하여 스레드를 시작합니다.
public class testthread는 스레드 {public void run () {system.out.println ( "Hello World"); } public static void main (String [] args) {Thread Mthread = new TestThread (); mthread.start (); }} 2. runnable 인터페이스를 구현하고 인터페이스의 run () 메소드를 구현합니다.
주요 단계는 다음과 같습니다.
(1) 클래스를 사용자 정의하고 runnable 인터페이스를 구현하고 run () 메소드를 구현하십시오.
(2) 스레드 서브 클래스 인스턴스를 생성하고 런닝 가능한 인터페이스를 매개 변수로 구현하는 객체로 스레드 객체를 인스턴스화합니다.
(3) 스레드의 start () 메소드를 호출하여 스레드를 시작합니다.
공개 클래스 테스트 런 가능 구현 런닝 가능 {public void run () {System.out.println ( "Hello World"); }} public class testrunnable {public static void main (string [] args) {testrunable mtestrunnable = new TestRunnable (); 스레드 mthread = 새 스레드 (mtestrunnable); mthread.start (); }} 3. Callable 인터페이스를 구현하고 call () 메소드를 재정의합니다.
호출 가능한 인터페이스는 실제로 집행자 프레임 워크에서 기능 클래스입니다. Callable 인터페이스는 런닝 가능한 인터페이스와 유사하지만 런 가능보다 강력한 기능을 제공하며 주로 다음 3 점에서 나타납니다.
(1) 호출 가능은 작업이 수락 된 후 반환 값을 제공 할 수 있으며, 실행 가능은이 기능을 제공 할 수 없습니다.
(2) Callable의 Call () 메소드는 예외를 던질 수 있지만 run () 방법은 예외를 던질 수 없습니다.
(3) Callable을 실행하면 미래의 개체를 얻을 수 있습니다. 미래의 객체는 이브라히모비치의 계산 결과를 나타내며 계산이 완료되었는지 확인하는 방법을 제공합니다. 스레드는 비동기 계산 모델에 속하므로 다른 스레드에서 함수의 반환 값을 얻는 것은 불가능합니다. 이 경우 대상 스레드가 Call () 메소드를 호출 할 때 Call () 메소드를 모니터링하는 데 Future를 사용할 수 있습니다. 그러나 미래의 get () 메소드가 호출되면 결과를 얻을 때 현재 스레드는 Call () 메소드의 반환 결과를 차단하고 알게됩니다.
공개 클래스 testCallable {// 스레드 클래스 생성 공개 정적 클래스 MyTestCallable 구현 호출 가능 {public String Call ()은 예외 {retun "Hello World"; }} public static void main (String [] args) {myTestCallable mmyTestCallable = new MyTestCallable (); executorService mexecutorservice = executors.newsingLethreadPool (); 미래의 mfuture = mexecutorservice.submit (mmytestCallable); {// 스레드가 끝나기를 기다리고 결과 시스템을 반환하고 결과 시스템을 반환합니다 (mfuture.get ()); } catch (예외 e) {e.printstacktrace (); }}}위 프로그램의 출력 결과는 다음과 같습니다. Hello World
이 세 가지 방법 중에서 일반적으로 실행 가능한 인터페이스를 구현하는 것이 좋습니다. 그 이유는 첫째, 스레드 클래스는 파생 클래스에 의해 다시 작성 될 수있는 다양한 메소드를 정의하지만 run () 메소드 만 다시 작성해야 하며이 스레드의 주요 기능을 실현하고 런닝 가능한 인터페이스를 구현하는 데 필요한 방법입니다. 둘째, 클래스는 강화되거나 수정해야 할 때 상속되어야합니다. 따라서 스레드 클래스의 다른 방법을 무시할 필요가 없다면이 경우 런닝 가능한 인터페이스를 구현하는 것이 좋습니다.
3. 인터럽트 스레드 <br /> 스레드의 run () 메소드가 메소드 본문에서 마지막 문을 실행하고 반환 문을 실행하여 리턴 또는 메소드에 잡힌 예외가 캡처되지 않은 경우 스레드가 종료됩니다. 이전 버전의 Java에는 스톱 방법이 있었는데, 다른 스레드는 스레드를 종료하기 위해 호출 할 수 있지만이 방법은 이제 더 이상 사용되지 않았습니다.
인터럽트 방법을 사용하여 스레드 종료를 요청할 수 있습니다. 스레드가 인터럽트 메소드를 호출하면 스레드의 인터럽트 상태가 설정됩니다. 이것은 스레드가없는 부울 깃발입니다. 각 스레드는이 플래그를 때때로 확인하여 스레드가 중단되었는지 확인해야합니다.
스레드가 설정되어 있는지 확인하려면 Thread.CurrentThread ()를 호출 할 수 있습니다.
while (! thread.currentThread (). islerrupted ()) {do do something} 그러나 스레드가 차단되면 인터럽트 상태를 감지 할 수 없습니다. 이것은 중단 예고가 생성되는 곳입니다. 차단 된 스레드에서 인터럽트 방법이 호출 될 때 (수면 또는 대기라고 함). 차단 호출은 InterruptedException에 의해 중단됩니다.
각 반복 후 수면 방법 (또는 기타 중단 방법)이 호출되면 중단 감지는 불필요하고 쓸모가 없습니다. 인터럽트 상태가 설정 될 때 수면 방법이 호출되면 수면은 없지만 상태를 비우고 인터럽트 픽스를 던집니다. 따라서 루프에서 Sleep을 호출하면 인터럽트 상태를 감지하지 말고 중단 외지를 잡으십시오.
많은 게시 된 코드에서, 당신은 InterruptedException이 매우 낮은 수준에서 억제된다는 것을 알게 될 것입니다.
void mytask () {... try {sleep (50)} catch (InterruptedException e) {...}}이것을하지 마십시오. 캐치에 어떤 이점이 있다고 생각하지 않으면 두 가지 합리적인 옵션이 있습니다.
인터럽트 상태를 설정하려면 CATH에서 Thread.CurrentThread (). Interrup ()을 호출하십시오. 발신자는 그것을 감지 할 수 있습니다. 더 나은 옵션은 Throws InterpruptedException을 사용하여 완료된 문을 캡처하기 위해 시도 문을 사용하지 않고 메소드를 표시하는 것입니다. 이런 식으로 발신자는 다음과 같은 예외를 포착 할 수 있습니다.
void mytask () Throw InterruptedException {sleep (50)}4. 실의 상태
(1). 새로운 상태 (신규) : 새 스레드 객체가 생성됩니다.
(2). Ready State (runnable) : 스레드 객체가 생성 된 후 다른 스레드는 객체의 start () 메소드를 호출합니다. 이 상태의 스레드는 런닝 가능한 스레드 풀에 있으며 CPU 사용 권한을 얻기 위해 기다릴 수있게됩니다.
(3). 실행 상태 : 준비 상태의 스레드는 CPU를 획득하고 프로그램 코드를 실행합니다.
(4). 차단 된 상태 : 차단 된 상태는 스레드가 어떤 이유로 CPU 사용 권한을 포기하고 일시적으로 실행을 중단 함을 의미합니다. 스레드가 준비 상태에 들어가기 전까지는 달리기 상태로 갈 기회가 없습니다. 막힘에는 세 가지 유형이 있습니다.
- 대기 대기 차단 : 러닝 스레드가 대기 () 메소드를 실행하고 JVM은 스레드를 대기 풀에 넣습니다.
- 동기 차단 : 러닝 스레드가 객체의 동기화 잠금을 획득하면 동기화 잠금이 다른 스레드에서 점유되면 JVM은 스레드를 잠금 풀에 넣습니다.
- 기타 차단 : 실행중인 스레드가 수면 () 또는 join () 메소드를 실행하거나 I/O 요청을 발행하면 JVM이 스레드를 차단 상태로 설정합니다. Sleep () State가 시간이 초과되면 join ()는 스레드가 끝나거나 시간이 끝나기를 기다렸거나 I/O 처리가 완료되면 스레드가 준비 상태에 다시 들어갔습니다.
(5). 죽은 상태 : 스레드는 예외로 인해 실행 () 메소드를 실행하거나 종료했으며 스레드는 수명주기를 종료합니다.
5. 스레드 우선 순위 및 데몬 스레드
1. 스레드 우선 순위
Java에서는 각 스레드가 우선 순위를 가지며 기본적으로 스레드는 부모 클래스의 우선 순위를 상속합니다. set -friority 메소드를 사용하여 스레드 우선 순위를 높이거나 줄일 수 있습니다. 우선 순위는 min_priority (스레드 클래스에서 1으로 정의 됨)와 max_priority (스레드 클래스에서 10으로 정의 됨) 사이의 값으로 설정할 수 있습니다. 스레드의 기본 우선 순위는 Norm_Priority (스레드 클래스에서 5로 정의 됨)입니다.
우선 순위에 의존하지 마십시오. 실제로 사용하려면 초보자가 저지르는 일반적인 실수를 피해야합니다. 많은 우선 순위가 비활성 상태로 들어 가지 않으면 우선 순위가 낮은 스레드가 실행되지 않을 수 있습니다. 스케줄러가 새 스레드를 실행하기로 결정할 때마다 우선 순위가 낮은 스레드를 완전히 선택하지만 우선 순위가 낮습니다.
2. 데몬 스레드
Call SetDaemon (true); 스레드를 데몬 스레드로 변환합니다. 데몬 스레드의 유일한 목적은 다른 스레드에 서비스를 제공하는 것입니다. 타이밍 스레드가 예입니다. 다른 스레드에 정기적으로 신호를 보내거나 캐시 항목을 알려주는 오래된 스레드를 지 웁니다. 데몬 스레드 만 남으면 가상 머신이 종료됩니다. 데몬 스레드 만 남아 있으면 프로그램을 계속 실행할 필요가 없기 때문입니다.
또한 JVM의 쓰레기 수집, 메모리 관리 및 기타 스레드는 데몬 스레드입니다. 또한 데이터베이스 애플리케이션을 수행 할 때 사용 된 데이터베이스 연결 풀에는 많은 백그라운드 스레드가 포함되어 있으며 연결 수, 시간 초과 시간, 상태 등이 포함되어 있습니다.
위는 Java Multithreading의 스레드 정의, 상태 및 속성에 관한 것입니다. 모든 사람의 학습에 도움이되기를 바랍니다.