예를 들어 Java의 다중 루틴 프로그래밍에 대해 설명합니다.
대부분의 경우 Thread 객체를 실례화하여 스레드를 생성합니다.Java는 다음과 같은 두 가지 방식을 정의합니다.
Runnable 인터페이스 구현
라인을 만드는 가장 간단한 방법은 Runnable 인터페이스를 실현하는 클래스를 만드는 것이다.Runnable은 실행 코드 단원을 추상화했습니다.너는 Runnable 인터페이스를 실현하는 방법을 통해 모든 대상의 라인을 만들 수 있다.Runnable 인터페이스를 실현하기 위해서는 하나의 클래스가 run()을 실현하는 간단한 방법만 필요합니다. 이 방법은 다음과 같습니다.
public void run( )
run () 에서 코드를 정의하여 새로운 라인을 구축할 수 있습니다.다음 내용을 이해하는 것은 매우 중요하다. run () 방법은 메인 라인처럼 다른 방법을 호출하고 다른 종류를 인용하며 변수를 설명할 수 있다.유일한 차이점은 run () 이 프로그램에서 다른 병행 루틴 실행 입구를 확립하는 것이다.run () 이 되돌아오면 이 스레드가 끝납니다.Runnable 인터페이스를 실현하는 클래스를 만든 후, 클래스 내부에서thread 클래스의 대상을 실례화해야 합니다.Thread 클래스는 여러 가지 구조 함수를 정의합니다.우리는 다음과 같이 사용할 것이다.
Thread(Runnable threadOb, String threadName)
이 구조 함수에서threadOb는 Runnable 인터페이스 클래스를 실현하는 실례입니다.이것은 스레드 실행의 시작점을 정의합니다.새 스레드의 이름은threadName에서 정의합니다.새 라인을 만든 후, start () 방법을 호출할 때까지 실행하지 않습니다. 이 방법은Thread 클래스에서 정의됩니다.본질적으로, start () 는 run () 에 대한 호출을 실행합니다.Start() 메서드는 다음과 같이 선언합니다.
void start( )
다음 예는 새 스레드를 만들고 실행하는 것입니다.
// Create a second thread.
class NewThread implements Runnable {
Thread t;
NewThread() {
// Create a new, second thread
t = new Thread(this, "Demo Thread");
System.out.println("Child thread: " + t);
t.start(); // Start the thread
}
// This is the entry point for the second thread.
public void run() {
try {
for(int i = 5; i > 0; i--) {
System.out.println("Child Thread: " + i);
Thread.sleep(500);
}
} catch (InterruptedException e) {
System.out.println("Child interrupted.");
}
System.out.println("Exiting child thread.");
}
}
class ThreadDemo {
public static void main(String args[]) {
new NewThread(); // create a new thread
try {
for(int i = 5; i > 0; i--) {
System.out.println("Main Thread: " + i);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
System.out.println("Main thread interrupted.");
}
System.out.println("Main thread exiting.");
}
}
NewThread 구조 함수에서 새 Thread 객체는 다음 문장에서 생성됩니다.
t = new Thread(this, "Demo Thread");
앞의 문장this를 통해this 대상에서 run () 방법을 호출하고 싶다는 것을 보여 줍니다.그리고 start () 가 호출되어run () 방법으로 라인의 실행을 시작합니다.이것은 하위 스레드 for 순환을 실행하기 시작합니다.start()를 호출하면 NewThread의 구조 함수가main()으로 되돌아옵니다.주 라인이 복구되면 for 순환에 도달합니다.순환이 끝날 때까지 두 스레드가 계속 실행되고 CPU를 공유합니다.이 프로그램의 출력은 다음과 같습니다.
Child thread: Thread[Demo Thread,5,main]
Main Thread: 5
Child Thread: 5
Child Thread: 4
Main Thread: 4
Child Thread: 3
Child Thread: 2
Main Thread: 3
Child Thread: 1
Exiting child thread.
Main Thread: 2
Main Thread: 1
Main thread exiting.
앞에서 언급한 바와 같이, 다중 루틴 프로그램에서 일반적인 주 루틴은 실행을 끝내는 마지막 루틴이어야 한다.실제로 일부 오래된 JVM은 메인 스레드가 하위 스레드보다 먼저 끝나면 Java의 운행 시간 시스템이 끊길 수 있다.상술한 프로그램은 메인 라인의 마지막 종료를 보장했다. 왜냐하면 메인 라인의 침수 주기는 1000밀리초이고 하위 라인은 500밀리초에 불과하기 때문이다.이것은 하위 라인을 주 라인이 끝나기 전에 먼저 끝내게 한다.요컨대, 너는 라인이 끝날 때까지 기다리는 더 좋은 방법을 보게 될 것이다.확장 스레드
라인을 만드는 또 다른 방법은 Thread 클래스를 확장하기 위해 새 클래스를 만들고 이 클래스의 실례를 만드는 것입니다.클래스가 Thread를 계승할 때, run () 방법을 다시 불러와야 합니다. 이 run () 방법은 새 라인의 입구입니다.새 스레드 실행을 시작하려면 start () 방법을 사용해야 합니다.다음은 확장thread 클래스로 앞의 프로그램을 다시 씁니다.
// Create a second thread by extending Thread
class NewThread extends Thread {
NewThread() {
// Create a new, second thread
super("Demo Thread");
System.out.println("Child thread: " + this);
start(); // Start the thread
}
// This is the entry point for the second thread.
public void run() {
try {
for(int i = 5; i > 0; i--) {
System.out.println("Child Thread: " + i);
Thread.sleep(500);
}
} catch (InterruptedException e) {
System.out.println("Child interrupted.");
}
System.out.println("Exiting child thread.");
}
}
class ExtendThread {
public static void main(String args[]) {
new NewThread(); // create a new thread
try {
for(int i = 5; i > 0; i--) {
System.out.println("Main Thread: " + i);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
System.out.println("Main thread interrupted.");
}
System.out.println("Main thread exiting.");
}
}
이 프로그램은 상술한 버전과 같은 출력을 생성합니다.하위 스레드는 실례화된 NewThread 객체에서 생성되며 이 객체는 Thread 클래스에서 파생됩니다.NewThread에서 super() 호출을 주의하십시오.이 메서드는 다음과 같은 Thread 구조 함수를 호출합니다.
public Thread(String threadName)
threadName에서 스레드 이름을 지정합니다.적합한 방법을 선택하다
여기까지 오면 왜 자바에 두 가지 서브루틴을 만드는 방법이 있는지 이상할 것이다. 어떤 것이 더 좋을까.모든 문제는 한 가지로 귀착된다.Thread 클래스는 파생 클래스에 재부팅될 수 있는 여러 가지 방법을 정의합니다.모든 방법에 대해 유일하게 다시 불러와야 하는 것은run () 방법이다.이것은 당연히 Runnable 인터페이스를 실현하는 데 필요한 똑같은 방법이다.많은 자바 프로그래머들은 클래스가 강화되거나 수정될 때만 확장되어야 한다고 생각한다.따라서 Thread의 다른 방법을 다시 불러오지 않을 때는 Runnable 인터페이스만 실행하는 것이 좋습니다.이것은 당연히 네가 결정해야 한다.그러나 본 장의 다른 부분에서 우리는 runnable 인터페이스를 실현하는 클래스를 응용하여 라인을 만듭니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.