Java 동시 프로그래밍 예(6): 스레드 실행 종료 대기
이를 위해, Thread 클래스는 join () 방법을 제공합니다.우리가 루틴 대상을 사용하여 이 방법을 호출할 때, 호출 중인 루틴 대상은 호출 대상이 실행된 후에 실행을 시작할 때까지 연기됩니다.
이 절에서 예시 프로그램은 초기화 방법이 완성되기를 기다린 후에 다른 작업을 수행하는 것을 보여 준다.
그 사실을 알다
아래와 같은 절차에 따라 예시 절차를 완성하다.
1. DataSourcesLoader라는 클래스를 만들고 Runnable 인터페이스를 실현합니다.코드는 다음과 같습니다.
public class DataSourcesLoader implements Runnable {
2.run() 방법을 실현하여 컨트롤러에 실행 시작을 설명하고 4초 동안 잠을 자고 컨트롤러에 실행 완료를 설명하기 위해 정보를 출력합니다.코드는 다음과 같습니다.
@Override
public void run() {
System.out.printf("Beginning data sources loading: %s
",
new Date());
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.printf("Data sources loading has finished: %s
",
new Date());
}
3. NetworkConnectionsLoader라는 클래스를 만들고 Runnable 인터페이스를 실현합니다.run() 방법을 실현합니다. 이 방법 코드는 DataSourcesLoader 클래스의run() 방법과 같습니다. 단지 이 수면 6초입니다.4. 예시된 메인 클래스를 실현하고main () 방법을 실현한다.코드는 다음과 같습니다.
public class Main {
public static void main(String[] args) {
5. DataSourcesLoader 객체와 실행을 시작하는 Thread 객체를 만듭니다.코드는 다음과 같습니다.
DataSourcesLoader dsLoader = new DataSourcesLoader();
Thread thread1 = new Thread(dsLoader, "DataSourcesLoader");
6. NetworkConnectionsLoader 객체와 실행을 시작하는 Thread 객체를 만듭니다.코드는 다음과 같습니다.
NetworkConnectionsLoader ncLoader = new NetworkConnectionsLoader();
Thread thread2 = new Thread(ncLoader, "NetworkConnectionsLoader");
7. 두 Thread 객체의 start() 메서드를 호출합니다.코드는 다음과 같습니다.
thread1.start();
thread2.start();
8. join () 방법을 호출하여 두 라인이 임무를 완성하기를 기다립니다.이 방법은 Interrupted Exception 이상을 던지기 때문에 이 이상을 포착해야 합니다.코드는 다음과 같습니다.
try {
thread1.join();
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
9. 컨트롤러에 한 마디를 인쇄하면 프로그램 실행이 끝났다는 것을 나타낸다.코드는 다음과 같습니다.
System.out.printf("Main: Configuration has been loaded: %s
",
new Date());
10. 실행 프로그램을 실행하여 실행 효과를 보십시오.그 까닭을 알다
이 예시 프로그램을 실행할 때, 우리는 두 개의 라인이 그것들의 실행을 시작하는 것을 볼 수 있다.먼저 DataSourcesLoader가 수행합니다.그리고 NetworkConnectionsLoader가 실행을 완료했습니다.이 때, 메인 루틴은 실행을 계속하고, 컨트롤러에 종료 정보를 출력합니다.
영원히 끝이 없다
Java는 다음과 같은 두 가지 재부팅 방법을 제공합니다.
join(long milliseconds)
join(long milliseconds, long nanos)
첫 번째 방식은 작업이 완료될 때까지 호출되지 않고 파라미터가 지정한 시간을 기다린 후에 실행됩니다.예를 들어,thread1이 이 방법을 호출한다면,thread1.join(1000),thread1 스레드가 다음 중 하나를 충족하면 계속 실행됩니다.1.thread2 실행 완료하기;
2.1000밀리초 후;
이 두 조건 중 하나가 진실일 때,join () 방법은 되돌아와 원래의 임무를 계속 수행하기 시작합니다.
두 번째 방식의 방법은 첫 번째 방식과 매우 유사하지만 단지 나초급의 시간 매개 변수가 하나 더 생겼을 뿐이다.
나래주의
본고는 《Java7 Concurrency Cookbook》(D 오이고에서 《Java7 병발 예시집》으로 번역)에서 번역한 것으로 학습 자료로만 사용된다.권한이 없으면 어떠한 상업 행위에도 사용할 수 없다.
소소하다
이 절에서 사용한 예시 코드의 전체 버전.
DataSourcesLoader 클래스의 전체 코드
package com.diguage.books.concurrencycookbook.chapter1.recipe6;
import java.util.Date;
import java.util.concurrent.TimeUnit;
/**
* Date: 2013-09-19
* Time: 09:15
*/
public class DataSourcesLoader implements Runnable {
@Override
public void run() {
System.out.printf("Beginning data sources loading: %s
",
new Date());
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.printf("Data sources loading has finished: %s
",
new Date());
}
}
NetworkConnectionsLoader 클래스의 전체 코드
package com.diguage.books.concurrencycookbook.chapter1.recipe6;
import java.util.Date;
import java.util.concurrent.TimeUnit;
/**
* Date: 2013-09-19
* Time: 09:21
*/
public class NetworkConnectionsLoader implements Runnable {
@Override
public void run() {
System.out.printf("Beginning data sources loading: %s
",
new Date());
try {
TimeUnit.SECONDS.sleep(6);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.printf("Data sources loading has finished: %s
",
new Date());
}
}
Main 클래스의 전체 코드
package com.diguage.books.concurrencycookbook.chapter1.recipe6;
import java.util.Date;
/**
* Date: 2013-09-19
* Time: 09:25
*/
public class Main {
public static void main(String[] args) {
DataSourcesLoader dsLoader = new DataSourcesLoader();
Thread thread1 = new Thread(dsLoader, "DataSourcesLoader");
NetworkConnectionsLoader ncLoader = new NetworkConnectionsLoader();
Thread thread2 = new Thread(ncLoader, "NetworkConnectionsLoader");
thread1.start();
thread2.start();
try {
thread1.join();
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.printf("Main: Configuration has been loaded: %s
",
new Date());
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.