>  기사  >  Java  >  Java 동시 프로그래밍: Thread 클래스를 사용하는 방법은 무엇입니까?

Java 동시 프로그래밍: Thread 클래스를 사용하는 방법은 무엇입니까?

零下一度
零下一度원래의
2017-06-23 09:16:041988검색
Java 동시 프로그래밍: Thread 클래스 사용
  
  다음은 이 기사의 목차 개요입니다.
  1. Thread 상태
2. 컨텍스트 전환
3. Thread 클래스의 메서드
Reprinted from:
 

1. 스레드 상태

  스레드는 생성부터 최종 종료까지 여러 상태를 거칩니다. 일반적으로 스레드에는 생성(새 항목), 준비(실행 가능), 실행 중(실행 중), 차단됨(차단됨), 시간 대기, 대기 및 종료(죽음) 상태가 포함됩니다.
  
  아래 그림은 스레드 생성부터 종료까지의 상태를 설명합니다.

일부 튜토리얼에서는 차단, 대기, 시간 대기를 총칭하여 차단 상태라고 합니다. 하지만 여기서는 스레드 상태를 Java의 메서드 호출과 연결하고 싶기 때문에 대기와 대기 시간의 두 가지 상태를 분리합니다.

2. 컨텍스트 전환

 싱글 코어 CPU(멀티 코어 CPU의 경우 이는 하나의 코어로 이해됨)의 경우 CPU는 한 번에 하나의 스레드만 실행할 수 있으며, 다른 스레드 실행으로 전환됩니다. 스레드. 이를 스레드 컨텍스트 전환이라고 합니다(프로세스에서도 마찬가지입니다).
 

3. Thread 클래스의 메소드

java.lang.Thread 클래스의 소스 코드를 보면 다음을 볼 수 있습니다.

Thread 클래스는 Runnable 인터페이스를 구현합니다. Thread 클래스에는 몇 가지 핵심 항목이 있습니다. 이름과 같은 속성은 Thread 클래스의 생성자에 있는 매개변수를 통해 스레드 이름을 지정할 수 있습니다. 우선순위는 스레드의 우선순위를 나타냅니다. 10, 최소값은 1, 기본값은 5) 데몬은 스레드가 데몬 스레드인지 여부를 나타내며 대상은 수행할 작업을 나타냅니다.
  Thread 클래스에서 일반적으로 사용되는 메소드는 다음과 같습니다.
스레드의 실행 상태와 관련된 여러 메소드는 다음과 같습니다.
1) 시작 메소드
Start()는 스레드를 시작하는 데 사용됩니다. start 메소드가 호출되면 시스템은 사용자 정의 하위 작업을 실행하기 위해 새 스레드를 엽니다. 이 프로세스에서 필요한 리소스가 해당 스레드에 할당됩니다.
 2) run 메소드
 run() 메소드는 사용자가 스레드를 호출할 필요가 없습니다. start 메소드를 통해 스레드가 시작되면 스레드가 CPU 실행 시간을 얻으면 run 메소드 본문에 들어가 특정 작업을 수행합니다. 작업. Thread 클래스를 상속하는 경우 run 메서드를 재정의하고 run 메서드에서 수행할 특정 작업을 정의해야 합니다.
  3) 수면 방법
  수면 방법에는 두 가지 오버로드 버전이 있습니다. (긴 밀리초) //파라미터는 밀리초입니다.
sleep(long millis,int nanoseconds) //첫 번째 매개변수는 밀리초, 두 번째 매개변수는 나노초
  슬립은 스레드를 슬립시키고, CPU를 넘겨주고, CPU가 다른 작업을 수행하도록 하는 것과 같습니다.
  그러나 한 가지 주의할 점은 sleep 메소드가 잠금을 해제하지 않는다는 것입니다. 즉, 현재 스레드가 객체에 대한 잠금을 보유하고 있으면 sleep 메소드가 해제되더라도 다른 스레드는 해당 객체에 액세스할 수 없습니다. 라고 불리는. 다음 예를 보면 명확해집니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2 2
23
24
25
26
27
28
29
30
31
32
33
public class Test {
​​​​​​​
​​​ Object object = new Object();
​​​​​
​​​public static void main(String[] args)가 IOException을 발생시킵니다.​​ public void run() {
                                  | "+i);
                                                                                                                        System.out.println("                         ;
Thread.currentThread().sleep(10000);
                                                                       System.out.println("Thread"+Thread.currentThread().getName ()+ "수면 종료")
}
}
 출력 결과:
 

  위의 출력 결과를 보면 Thread-0이 Sleep 상태에 진입하면 Thread-1이 특정 작업을 수행하지 않는다는 것을 알 수 있습니다. Thread-0이 실행을 완료하고 Thread-0이 개체 잠금을 해제한 경우에만 Thread-1이 실행을 시작합니다.
sleep 메소드가 호출되면 InterruptedException이 포착되거나 상위 레이어로 던져져야 한다는 점에 유의하세요. 스레드 휴면 시간이 지나면 CPU가 이 시간에 다른 작업을 수행 중일 수 있으므로 즉시 실행되지 않을 수 있습니다. 따라서 sleep 메소드를 호출하는 것은 스레드를 차단 상태로 만드는 것과 같습니다.
 4) 항복 메서드
yield 메서드를 호출하면 현재 스레드가 CPU 권한을 넘겨주고 CPU가 다른 스레드를 실행할 수 있게 됩니다. Sleep 방식과 유사하며 잠금을 해제하지 않습니다. 그러나 Yield는 CPU를 넘겨주는 특정 시간을 제어할 수 없습니다. 또한, Yield 메서드는 동일한 우선 순위를 가진 스레드에게만 CPU 실행 시간을 얻을 수 있는 기회를 허용할 수 있습니다.
Yield 메서드를 호출하면 스레드가 차단 상태가 되는 것이 아니라 스레드가 준비 상태로 돌아갑니다. CPU 실행 시간이 다시 확보될 때까지 기다리기만 하면 된다는 점에 유의하세요. 이는 sleep 메서드와 다릅니다.
 5) 조인 방법
 조인 방법에는 세 가지 오버로드 버전이 있습니다.
1
2
3
join()
join(긴 밀리초) // 매개변수는 밀리초
join(long millis,int nanoseconds) //첫 번째 매개변수는 밀리초, 두 번째 매개변수는 나노초
메인 스레드에서 thread.join 메소드가 호출되면 메인 메소드는 스레드 스레드의 실행이 완료될 때까지 기다리거나 일정 시간 동안 대기합니다. 매개변수가 없는 조인 메소드가 호출되면 스레드가 실행을 완료할 때까지 기다립니다. 지정된 시간 매개변수가 있는 조인 메소드가 호출되면 특정 이벤트를 기다립니다.
 다음 예를 살펴보세요.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
공개 수업 테스트                  님의 방법을 사용하여 ‐ ‐ ‐ ‐ ‐ ‐ ,                                                                             ). getName());              테스트 테스트 = new Test();            thread1 = test.System.out.println("Thread" +Thread.currentThread().getName()+"wait") ;
class MyThread는 Thread를 확장합니다{
public void run() {
   
          } catch (InterruptedException e) {
                                                                                              }
}
}
출력 결과:

thread1.join() 메서드가 호출되면 메인 스레드가 기다린 다음 계속하기 전에 thread1의 실행이 완료될 때까지 기다리는 것을 볼 수 있습니다.
  실제로 Join 메서드를 호출하면 Object의 wait 메서드가 호출됩니다. 이는 소스 코드를 보면 알 수 있습니다.
 

  wait 메서드는 스레드를 차단 상태로 만들고 개체가 차지한 잠금을 해제합니다. 스레드를 CPU 실행 권한으로 넘겨줍니다.
wait 메서드는 스레드가 개체 잠금을 해제하도록 하기 때문에 조인 메서드도 스레드가 개체에 설정된 잠금을 해제하도록 합니다. wait 메서드의 구체적인 사용법은 다음 문서에 나와 있습니다.
 6) 인터럽트 방법
 인터럽트는 이름 그대로 인터럽트를 의미합니다. 인터럽트 메서드만 호출하면 차단된 상태의 스레드에서 예외가 발생할 수 있습니다. 즉, 차단된 상태의 스레드를 중단하는 데 사용할 수 있으며, 인터럽트 메서드와 isInterrupted() 메서드를 사용하여 중단할 수 있습니다. 실행 중인 스레드.
 아래 예를 살펴보세요.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 공개 수업 테스트 {
                                           .start();
                                          ~                             thread.interrupt()                               Y 클래스 Mythread는 스레드를 확장합니다. {
@v@Public void run () {
시스템을 사용해 보세요. .out.println( "잠자기 상태 입력");
               System.out.println("잠자기 완료");          System.out.println(" 실행 메서드가 실행되었습니다.");
              ~
  출력 결과:
 

  여기서 보면 차단된 상태의 스레드가 인터럽트 메소드를 통해 중단될 수 있음을 알 수 있습니다. 그러면 비차단 상태의 스레드가 중단될 수 있습니까? 다음 예를 보세요. 9
101112 4 25
공개수업 시험 {
public static void main (string [] args)은 ioexception try {
thread.currentthread ()
}
}
이 프로그램을 실행하면 변수 i의 값이 Integer.MAX_VALUE를 초과할 때까지 while 루프가 계속 실행되는 것을 볼 수 있습니다. 따라서 인터럽트 메서드를 직접 호출하면 실행 중인 스레드를 중단할 수 없습니다.
 그러나 isInterrupted()를 사용하여 실행 중인 스레드를 중단할 수 있는 경우, 인터럽트 메서드를 호출하는 것은 인터럽트 플래그를 true로 설정하는 것과 동일하므로 isInterrupted()를 호출하여 스레드 실행을 중단하여 인터럽트가 발생했는지 여부를 확인할 수 있습니다. 플래그가 설정되었습니다. 예를 들어, 다음 코드는
}
1
2
3
4
5
6
7
8
9
10
11
2 4
25
public class Test {
      public static void main(String[] args) throws                                        다음을 시도하세요.                                                              );
}
class MyThread 확장 Thread{
@Override V Public void run () {
int i = 0;
while (! Isinterrupted () && i & lt; 정수.max_value) {
시스템 .out.println (i+"while Cycle");
}
}}}
Run은 여러 값을 인쇄한 후 While 루프가 인쇄를 중지함을 발견합니다.
 그러나 일반적으로 이런 방식으로 스레드를 중단하는 것은 권장되지 않습니다. 일반적으로 isStop 속성이 MyThread 클래스에 추가되어 while 루프 종료 여부를 표시한 다음 isStop 값이 while 루프에서 결정됩니다. ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
10
11
12
13
14
class MyThread는 Thread를 확장합니다{
               개인 휘발성 부울 isStop = false
                                             ~ ~
그런 다음 외부에서 setStop 메서드를 호출하여 while 루프를 종료할 수 있습니다.
 7) 중지 방법
  중지 방법은 버려진 방법이며 안전하지 않은 방법입니다. stop 메소드를 호출하면 run 메소드 호출이 직접 종료되고 ThreadDeath 오류가 발생하기 때문입니다. 스레드가 객체 잠금을 보유하고 있으면 잠금이 완전히 해제되어 일관성 없는 객체 상태가 됩니다. 따라서 stop 메소드는 기본적으로 사용하지 않습니다.
 8) 파괴 방법
 파괴 방법도 버려진 방법입니다. 기본적으로 사용되지 않습니다.
  다음은 스레드 속성과 관련된 여러 가지 방법입니다.
 1) getId
  스레드 ID를 가져오는 데 사용됩니다.
  2) getName 및 setName
  스레드 이름을 가져오거나 설정하는 데 사용됩니다.
 3) getPriority 및 setPriority
  스레드 우선순위를 가져오고 설정하는 데 사용됩니다.
 4) setDaemon 및 isDaemon
 은 스레드가 데몬 스레드가 되는지 여부를 설정하고 스레드가 데몬 스레드인지 여부를 확인하는 데 사용됩니다.
 데몬 스레드와 사용자 스레드의 차이점은 데몬 스레드는 자신을 생성한 스레드에 의존하지만 사용자 스레드는 그렇지 않다는 것입니다. 간단한 예를 들자면, 메인 스레드에 데몬 스레드가 생성되면 메인 메소드의 실행이 완료되면 데몬 스레드도 종료됩니다. 사용자 스레드는 완료될 때까지 계속 실행되지 않습니다. JVM에서 가비지 수집기 스레드는 데몬 스레드입니다.
 Thread 클래스에는 현재 스레드를 얻기 위해 일반적으로 사용되는 정적 메서드 currentThread()가 있습니다.
  위에서 Thread 클래스의 메서드 대부분을 언급했는데, Thread 클래스의 메서드 호출이 어떻게 스레드 상태를 변경하게 될까요? 다음 사진은 위 사진을 개선한 것입니다.

위 내용은 Java 동시 프로그래밍: Thread 클래스를 사용하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:XML을 구문 분석하는 네 가지 방법다음 기사:XML을 구문 분석하는 네 가지 방법

관련 기사

더보기