바로 요점을 말하자면
IT 분야에서는 동시성에 대해 이야기할 때마다 컴퓨터에서 동시에 실행되는 일련의 스레드에 대해 이야기하게 됩니다. 이 컴퓨터에 다중 프로세서 또는 다중 코어 프로세서가 있는 경우 실제로는 "동시에 실행 중"입니다. 그러나 컴퓨터에 단일 코어 프로세서만 있는 경우 "동시 실행"은 겉보기에 불과합니다.
모든 최신 운영 체제는 작업의 동시 실행을 지원합니다. 첫 번째 이메일을 지연시키지 않고 온라인으로 음악을 듣고 뉴스를 읽을 수 있습니다. 이 동시성은 프로세스 수준 동시성이라고 말할 수 있습니다. 프로세스 내부에서도 동시 작업이 많이 있는 것을 볼 수 있습니다. 프로세스 스레드에서 실행되는 동시 작업을 호출합니다.
동시성과 관련된 또 다른 일반적인 개념은 병렬성입니다. 동시성과 병렬성 사이에는 몇 가지 차이점과 연관성이 있습니다. 일부 프로그래머(저자, "프로그래머"로 음역)는 단일 코어 프로세서에서 다중 스레드로 애플리케이션을 실행하는 것이 동시성이라고 믿고 있으며, 또한 프로그램이 다중 스레드로 실행될 때 프로그래머의 실행을 관찰할 수 있습니다. 다중 프로세서 또는 다중 코어 프로세서에서는 병렬입니다. 응용 프로그램의 스레드가 미리 정해진 순서대로 실행되지 않으면 문제 해결을 단순화하기 위해 스레드를 사용하고 이러한 스레드가 특정 순서로 실행되면 동시성이라고 생각하는 프로그래머도 있습니다. 이것이 병렬성입니다.
이 장에서는 12개의 예제를 사용하여 Java7 API를 사용하여 몇 가지 기본 스레드 작업을 수행하는 방법을 보여줍니다. Java 프로그램에서 스레드를 생성하고 실행하는 방법, 스레드 실행을 제어하는 방법, 스레드 그룹을 하나의 단위로 조작하는 방법 등을 볼 수 있습니다.
이번 장에서는 자바 프로그램에서 스레드를 생성하는 방법과 이를 실행하는 방법을 알아봅니다. Java 프로그램에서는 모든 것이 객체이고 스레드도 마찬가지입니다. 스레드를 생성하는 방법에는 두 가지가 있습니다.
1. Thread 클래스를 상속하고 run() 메서드를 재정의합니다.
2. Runnable 인터페이스를 구현하는 클래스를 생성한 다음 Thread 클래스의 객체를 생성하고 Runnable 인터페이스를 구현하는 클래스의 인스턴스를 Thread 클래스의 인스턴스에 매개 변수로 전달합니다.
이번 절에서는 두 번째 방법을 사용하여 10개의 스레드를 생성하고 실행해 보겠습니다. 각 스레드는 10개 이내의 두 정수의 곱을 계산하고 인쇄합니다.
알아요
이 예제를 구현하려면 아래 설명된 단계를 따르세요.
1. Calculator라는 클래스를 생성하고 Runnable 인터페이스를 구현합니다. 코드는 다음과 같습니다:
다음과 같이 코드 코드를 복사합니다.
공개 클래스 계산기는 Runnable을 구현합니다.
2. number라는 개인 정수 속성을 선언하고 이 클래스의 생성자를 구현하여 방금 선언한 속성을 초기화합니다. 코드는 다음과 같습니다:
다음과 같이 코드 코드를 복사합니다.
개인 정수 번호;
공개 계산기(정수) {
this.번호 = 번호;
}
3. 우리가 생성한 스레드가 실행될 때 실행되는 프로그램(명령어)인 run() 메서드를 구현하므로 이 메서드를 사용하여 곱셈표를 계산합니다. 구체적인 코드는 다음과 같습니다.
다음과 같이 코드 코드를 복사합니다.
@보수
공개 무효 실행() {
for (int i = 0; i < 10; i++) {
System.out.printf("%s: %d * %d = %d/n",
Thread.currentThread().getName(),
번호, i, i * 번호);
}
}
4. 이제 샘플 애플리케이션의 메인 클래스를 구현할 차례입니다. Main이라는 클래스를 만들고 클래스에 기본 메서드를 추가합니다. 코드는 다음과 같습니다:
다음과 같이 코드 코드를 복사합니다.
공개 클래스 메인 {
공개 정적 무효 메인(String[] args) {
5. main() 메서드 내에서 10회 순회하는 for 루프를 생성합니다. 루프 본문에서 Calculator 클래스의 객체 계산기를 생성하고 Thread 클래스의 객체 스레드를 생성한 후 계산기를 매개변수로 전달합니다. 스레드에 대한 생성자입니다. 마지막으로 스레드 객체의 start() 메서드를 호출합니다. 코드는 다음과 같습니다:
다음과 같이 코드 코드를 복사합니다.
for (int i = 0; i < 10; i++) {
계산기 계산기 = new Calculator(i);
스레드 스레드 = 새 스레드(계산기);
thread.start();
}
6. 이 프로그램을 실행하여 서로 다른 스레드가 어떻게 동시에 실행되는지 확인하십시오.
왜인지 알아
다음은 프로그램을 실행할 때 콘솔에 출력되는 출력 부분입니다. 우리가 생성한 모든 스레드가 동시에 실행되고 있음을 알 수 있습니다.
다음과 같이 코드 코드를 복사합니다.
스레드-3: 3 * 5 = 15
스레드-0: 0 * 2 = 0
스레드-3: 3 * 6 = 18
스레드-1: 1 * 6 = 6
스레드-1: 1 * 7 = 7
스레드-3: 3 * 7 = 21
스레드-3: 3 * 8 = 24
스레드-0: 0 * 3 = 0
스레드-0: 0 * 4 = 0
스레드-3: 3 * 9 = 27
스레드-1: 1 * 8 = 8
모든 Java 프로그램은 최소한 하나의 스레드를 실행합니다. Java 프로그램을 실행할 때 Java Virtual Machine(이하 JVM)은 스레드를 실행하고 main() 메서드가 포함된 프로그램을 호출합니다.
Thread 객체의 start() 메서드가 호출되면 다른 스레드가 생성됩니다. start() 메서드가 몇 번 호출되는지, 생성되는 스레드 수는 무엇입니까?
모든 스레드의 실행이 완료되면 Java 프로그램이 종료됩니다. (특별한 상황이 아니면 데몬이 아닌 모든 스레드가 실행됩니다.) 시작 스레드(예: main() 메서드를 실행하는 스레드)가 종료되면 나머지 스레드는 컴퓨팅 작업이 완료될 때까지 계속 실행됩니다. 스레드 중 하나가 System.exit()를 호출하여 JVM에 프로그램 종료를 요청하면 모든 스레드가 실행을 종료합니다.
Thread 객체의 run() 메서드가 호출되면 스레드가 생성되지 않습니다. 마찬가지로 Runnable 인터페이스를 구현하는 클래스의 run() 메서드가 호출되면 스레드가 생성되지 않습니다. 스레드는 Thread 객체의 start() 메서드가 호출될 때만 생성됩니다.
끝나지 않는
이 섹션의 시작 부분에서 언급했듯이 스레드를 만드는 또 다른 방법이 있습니다. Thread 클래스를 상속하고 run() 메서드를 재정의하는 것입니다. 이 방법으로 Thread 하위 클래스의 객체를 만든 다음 start()를 호출할 수 있습니다. 스레드를 생성하는 방법입니다.
다음과 같이 코드 코드를 복사합니다.
인터뷰를 준비하다 보니 이 "Java 7 Concurrency Cookbook"을 비롯하여 Java 멀티스레딩에 대한 많은 정보를 발견했습니다. 설명이 매우 간단하고 이해하기 쉽습니다. 멀티스레딩에 대해 많이 알고 있지만 진지하게 배우고 싶습니다. 검색해봐도 중국어 버전을 찾을 수 없어서 음식과 옷을 직접 만들어보기로 했습니다. 따라서 우리는 비공식 번역본을 출판할 계획이며, 제목은 "Java7 동시성 예제 컬렉션"(가칭)입니다.
교리를 사용하라
이 글은 "Java 7 Concurrency Cookbook"(D Gua Ge가 "Java7 Concurrency 예제 모음"으로 훔쳤습니다)을 번역한 것이며, 학습 자료로만 사용됩니다. 허가 없이 상업적인 목적으로 사용할 수 없습니다.
작은 성공
원본 책에는 완전한 코드가 없으므로 보기가 불편합니다. 따라서 D Gua 형제는 이 섹션에 표시된 코드의 전체 버전을 보여주기 위해 섹션을 추가했습니다.
Calculator 클래스의 전체 코드는 다음과 같습니다.
패키지 com.diguage.books.concurrencycookbook.chapter1.recipe1;
/**
* 날짜: 2013-09-13
* 시간: 21:42
*/
공개 클래스 계산기는 Runnable을 구현합니다.
개인 정수 번호;
공개 계산기(정수) {
this.번호 = 번호;
}
@보수
공개 무효 실행() {
for (int i = 0; i < 10; i++) {
System.out.printf("%s: %d * %d = %d/n",
Thread.currentThread().getName(),
번호, i, i * 번호);
}
}
}
Main 클래스의 전체 코드
다음과 같이 코드 코드를 복사합니다.
패키지 com.diguage.books.concurrencycookbook.chapter1.recipe1;
/**
* 날짜: 2013-09-13
* 시간 : 19:46
*/
공개 클래스 메인 {
공개 정적 무효 메인(String[] args) {
for (int i = 0; i < 10; i++) {
계산기 계산기 = new Calculator(i);
스레드 스레드 = 새 스레드(계산기);
thread.start();
}
}
}