멀티스레딩 Java
모든 애플리케이션은 여러 프로세스(인스턴스)를 가질 수 있습니다. 이 프로세스 각각은 단일 스레드 또는 여러 스레드로 할당될 수 있습니다. 이 튜토리얼에서는 여러 작업을 동시에 수행하는 방법을 살펴보고 스레드와 스레드 간 동기화에 대해 자세히 알아봅니다.
단일 스레드란 무엇입니까?
단일 스레드 Java 기본적으로 가볍고 가장 작은 처리 단위입니다. Java "스레드 클래스"를 사용하여 스레드를 사용합니다. 스레드에는 두 가지 유형이 있습니다. 사용자 스레드와 데몬 스레드 (데몬 스레드는 애플리케이션을 정리하고 싶을 때 사용되며 백그라운드에서 사용됩니다). 애플리케이션이 처음 시작되면 사용자 스레드가 생성됩니다. 그 후에, 우리는 많은 사용자 스레드와 데몬 스레드를 생성할 수 있습니다.
단일 스레드 예:
package demotest; public class GuruThread { public static void main(String[] args) { System.out.println("Single Thread"); } }
단일 스레드의 장점:
- 시스템에서 단일 스레드가 실행되므로 애플리케이션의 오버헤드가 줄어듭니다.
- 또한 애플리케이션의 유지 관리 비용도 절감됩니다.
멀티스레딩이란? Java?
멀티 스레딩 in Java CPU를 최대한 활용하기 위해 두 개 이상의 스레드를 동시에 실행하는 프로세스입니다. 멀티스레드 애플리케이션은 두 개 이상의 스레드가 동시에 실행되도록 실행합니다. 따라서 동시성이라고도 합니다. Java. 각 스레드는 서로 병렬로 실행됩니다. 다중 스레드는 별도의 메모리 영역을 할당하지 않으므로 메모리를 절약합니다. 또한 스레드 간 컨텍스트 전환에는 시간이 덜 걸립니다.
멀티 스레드의 예:
package demotest; public class GuruThread1 implements Runnable { public static void main(String[] args) { Thread guruThread1 = new Thread("Guru1"); Thread guruThread2 = new Thread("Guru2"); guruThread1.start(); guruThread2.start(); System.out.println("Thread names are following:"); System.out.println(guruThread1.getName()); System.out.println(guruThread2.getName()); } @Override public void run() { } }
멀티스레드의 장점:
- 스레드가 독립적이기 때문에 사용자가 차단되지 않으며, 한 번에 여러 작업을 수행할 수 있습니다.
- 스레드는 독립적이므로 한 스레드가 예외를 만나도 다른 스레드는 영향을 받지 않습니다.
스레드 수명주기 Java
스레드의 수명주기:
위 다이어그램에 표시된 것처럼 스레드의 수명 주기에는 다양한 단계가 있습니다.
- 신제품
- 실행 가능
- 달리는
- 기다리는
- 죽은
- 새로운 : 이 단계에서 스레드는 "Thread 클래스" 클래스를 사용하여 생성됩니다. 프로그램이 실행될 때까지 이 상태를 유지합니다. 시작 스레드. 태어난 실(Born Thread)이라고도 합니다.
- 실행 가능 : 이 페이지에서는 스레드 인스턴스가 시작 메소드로 호출됩니다. 실행을 완료하기 위해 스케줄러에 스레드 제어가 제공됩니다. 스레드 실행 여부는 스케줄러에 따라 다릅니다.
- 달리는: 스레드가 실행을 시작하면 상태가 "실행 중" 상태로 변경됩니다. 스케줄러는 스레드 풀에서 하나의 스레드를 선택하고 애플리케이션에서 실행을 시작합니다.
- 기다리는: 이것은 스레드가 기다려야 하는 상태입니다. 애플리케이션에서 여러 스레드가 실행 중이므로 스레드 간에 동기화가 필요합니다. 따라서 한 스레드는 다른 스레드가 실행될 때까지 기다려야 합니다. 따라서 이 상태를 대기 상태라고 합니다.
- 죽은: 스레드가 종료된 상태입니다. 스레드는 실행 상태에 있으며 처리가 완료되자마자 "죽은 상태"가 됩니다.
멀티스레딩 방법 Java
스레드에 일반적으로 사용되는 방법 중 일부는 다음과 같습니다.방법 | 상품 설명 |
---|---|
스타트() | 이 메소드는 스레드 실행을 시작하고 JVM 스레드에서 run() 메서드를 호출합니다. |
절전 모드(int 밀리초) | 이 방법은 스레드를 sleep 상태로 만들어 스레드 실행이 제공된 밀리초 동안 일시 중지되고 그 후 스레드가 다시 실행을 시작합니다. 이는 스레드 동기화에 도움이 됩니다. |
getName () | 스레드의 이름을 반환합니다. |
setPriority(int newpriority) | 스레드의 우선순위를 변경합니다. |
생산하다 () | 현재 스레드가 정지되고 다른 스레드가 실행됩니다. |
예: 이 멀티스레딩 프로그램에서는 Java 예를 들어, 스레드를 생성하고 스레드에 사용 가능한 내장 메서드를 살펴보겠습니다.
package demotest; public class thread_example1 implements Runnable { @Override public void run() { } public static void main(String[] args) { Thread guruthread1 = new Thread(); guruthread1.start(); try { guruthread1.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } guruthread1.setPriority(1); int gurupriority = guruthread1.getPriority(); System.out.println(gurupriority); System.out.println("Thread Running"); } }
코드 설명:
- 코드 라인 2: 우리는 Runnable 인터페이스를 구현하는 "thread_Example1" 클래스를 생성하고 있습니다. (인스턴스가 스레드에 의해 실행되도록 의도된 모든 클래스에 의해 구현되어야 합니다.)
- 코드 라인 4: 해당 메서드를 재정의하는 것이 필수이므로 실행 가능한 인터페이스의 실행 메서드를 재정의합니다.
- 코드 라인 6: 여기에서는 스레드 실행을 시작할 기본 메서드를 정의했습니다.
- 코드 라인 7: 여기서는 새 스레드 클래스를 인스턴스화하여 "guruthread1"이라는 새 스레드 이름을 만듭니다.
- 코드 라인 8: "guruthread1" 인스턴스를 사용하여 스레드의 "start" 메소드를 사용하겠습니다. 여기서 스레드가 실행되기 시작합니다.
- 코드 라인 10: 여기서는 "guruthread1" 인스턴스를 사용하여 스레드의 "sleep" 메서드를 사용하고 있습니다. 따라서 스레드는 1000밀리초 동안 휴면 상태가 됩니다.
- 코드 9-14: 여기에서는 중단된 예외가 발생하는 확인된 예외가 있으므로 try catch 블록에 절전 메서드를 넣었습니다.
- 코드 라인 15: 여기서는 스레드의 우선순위를 1로 설정합니다.
- 코드 라인 16: 여기서는 getPriority()를 사용하여 스레드의 우선순위를 얻습니다.
- 코드 라인 17: 여기서는 getPriority에서 가져온 값을 인쇄합니다.
- 코드 라인 18: 여기에서는 스레드가 실행되고 있는 텍스트를 작성하고 있습니다.
위 코드를 실행하면 다음과 같은 출력이 나옵니다.
출력:
5는 스레드 우선순위이고 스레드 실행은 코드의 출력인 텍스트입니다.
Java Thread Sync정시화
멀티스레딩에는 프로그램의 비동기적 동작이 있습니다. 한 스레드가 데이터를 쓰고 다른 스레드가 동시에 데이터를 읽는 경우 애플리케이션에 불일치가 발생할 수 있습니다. 두 개 이상의 스레드가 공유 리소스에 액세스해야 하는 경우 동기화 접근 방식이 사용됩니다. Java 동기화된 동작을 구현하기 위해 동기화된 메서드를 제공했습니다.
이 접근 방식에서 스레드가 동기화된 블록 내부에 도달하면 다른 스레드가 같은 객체에서 해당 메서드를 호출할 수 없습니다. 모든 스레드는 해당 스레드가 동기화된 블록을 완료하고 나올 때까지 기다려야 합니다. 이런 방식으로 동기화는 멀티스레드 애플리케이션에서 도움이 됩니다. 한 스레드는 다른 스레드가 실행을 마칠 때까지 기다려야 하며, 그런 다음에야 다른 스레드가 실행될 수 있습니다.
이는 다음과 같은 형식으로 작성될 수 있습니다.
Synchronized(object) { //Block of statements to be synchronized }
멀티스레딩 Java 예제 프로그램
이 멀티스레딩에서는 Java 예를 들어 두 개의 스레드를 사용하여 스레드 이름을 가져옵니다.
EXAMPLE1 :
GuruThread1.java package demotest; public class GuruThread1 implements Runnable{ /** * @param args */ public static void main(String[] args) { Thread guruThread1 = new Thread("Guru1"); Thread guruThread2 = new Thread("Guru2"); guruThread1.start(); guruThread2.start(); System.out.println("Thread names are following:"); System.out.println(guruThread1.getName()); System.out.println(guruThread2.getName()); } @Override public void run() { } }
코드 설명:
- 코드 라인 3: 우리는 Runnable을 구현하는 "GuruThread1" 클래스를 사용했습니다(인스턴스가 스레드에 의해 실행되도록 의도된 모든 클래스에 의해 구현되어야 합니다).
- 코드 라인 8: 이것이 수업의 주요 방법입니다.
- 코드 라인 9: 여기서는 Thread 클래스를 인스턴스화하고 "guruThread1"이라는 인스턴스를 생성하고 스레드를 생성합니다.
- 코드 라인 10: 여기서는 Thread 클래스를 인스턴스화하고 "guruThread2"라는 인스턴스를 생성하고 스레드를 생성합니다.
- 코드 라인 11: 우리는 guruThread1이라는 스레드를 시작합니다.
- 코드 라인 12: 우리는 guruThread2이라는 스레드를 시작합니다.
- 코드 라인 13: “스레드 이름은 다음과 같습니다.”라는 텍스트를 출력합니다.
- 코드 라인 14: 스레드 클래스의 getName() 메소드를 사용하여 스레드 1의 이름을 가져옵니다.
- 코드 라인 15: 스레드 클래스의 getName() 메소드를 사용하여 스레드 2의 이름을 가져옵니다.
위 코드를 실행하면 다음과 같은 출력이 나옵니다.
출력:
스레드 이름은 여기에서 다음과 같이 출력됩니다.
- Guru1
- Guru2
예 2 :
이 멀티스레딩에서는 Java 예를 들어, 실행 가능한 인터페이스의 run() 및 start() 메서드를 재정의하고 해당 클래스의 두 스레드를 생성하여 그에 따라 실행하는 방법을 알아봅니다.
또한, 우리는 두 가지 수업을 듣고 있습니다.
- 실행 가능한 인터페이스를 구현하는 것
- 또 다른 하나는 주요 메소드를 갖고 그에 따라 실행됩니다.
package demotest; public class GuruThread2 { public static void main(String[] args) { // TODO Auto-generated method stub GuruThread3 threadguru1 = new GuruThread3("guru1"); threadguru1.start(); GuruThread3 threadguru2 = new GuruThread3("guru2"); threadguru2.start(); } } class GuruThread3 implements Runnable { Thread guruthread; private String guruname; GuruThread3(String name) { guruname = name; } @Override public void run() { System.out.println("Thread running" + guruname); for (int i = 0; i < 4; i++) { System.out.println(i); System.out.println(guruname); try { Thread.sleep(1000); } catch (InterruptedException e) { System.out.println("Thread has been interrupted"); } } } public void start() { System.out.println("Thread started"); if (guruthread == null) { guruthread = new Thread(this, guruname); guruthread.start(); } } }
코드 설명:
- 코드 라인 2: 여기서는 메인 메소드를 포함하는 "GuruThread2" 클래스를 사용하겠습니다.
- 코드 라인 4: 여기서는 클래스의 주요 메서드를 사용합니다.
- 코드 라인 6-7: 여기서는 "threadguru3"로 GuruThread1 클래스(아래 코드 줄에서 생성됨)의 인스턴스를 생성하고 스레드를 시작합니다.
- 코드 라인 8-9: 여기서는 GuruThread3 클래스(아래 코드 줄에서 생성됨)의 또 다른 인스턴스를 “threadguru2”로 생성하고 스레드를 시작합니다.
- 코드 라인 11: 여기서는 실행 가능한 인터페이스를 구현하는 "GuruThread3" 클래스를 생성합니다(인스턴스가 스레드에 의해 실행되도록 의도된 모든 클래스에 의해 구현되어야 합니다).
- 코드 라인 13-14: 하나는 스레드 클래스 유형이고 다른 하나는 문자열 클래스인 두 개의 클래스 변수를 사용합니다.
- 코드 라인 15-18: 우리는 하나의 인수를 클래스 변수 guruname에 할당되는 문자열 유형(스레드 이름)으로 사용하여 스레드 이름이 저장되는 GuruThread3 생성자를 재정의합니다.
- 코드 라인 20: 여기서는 실행 가능한 인터페이스의 run() 메서드를 재정의합니다.
- 코드 라인 21: println 문을 사용하여 스레드 이름을 출력하고 있습니다.
- 코드 라인 22-31: 여기서는 카운터가 0으로 초기화된 for 루프를 사용하고 있으며 4보다 작아서는 안 됩니다(어떤 숫자든 사용할 수 있으므로 여기서 루프는 4번 실행됩니다). 그리고 카운터를 증가시킵니다. 우리는 스레드 이름을 인쇄하고 있으며 sleep 메서드에서 확인된 예외가 발생했기 때문에 try-catch 블록 내에서 스레드를 1000밀리초 동안 절전 모드로 만듭니다.
- 코드 라인 33: 여기서는 실행 가능한 인터페이스의 시작 메서드를 재정의합니다.
- 코드 라인 35: "Thread start"라는 텍스트를 출력하고 있습니다.
- 코드 라인 36-40: 여기서는 클래스 변수 guruthread에 값이 있는지 여부를 확인하기 위해 if 조건을 사용합니다. null인 경우 이름을 매개변수(생성자에 할당된 값)로 사용하는 스레드 클래스를 사용하여 인스턴스를 생성합니다. 그런 다음 start() 메서드를 사용하여 스레드가 시작됩니다.
위 코드를 실행하면 다음과 같은 출력이 나옵니다.
산출:
두 개의 스레드가 있으므로 "스레드 시작됨"이라는 메시지가 두 번 표시됩니다.
우리는 스레드를 출력할 때 스레드의 이름을 얻습니다.
카운터와 스레드 이름을 인쇄하는 for 루프로 들어가고 카운터는 0으로 시작합니다.
루프는 세 번 실행되며 그 사이에 스레드는 1000밀리초 동안 휴면 상태로 유지됩니다.
따라서 먼저 guru1을 얻은 다음 guru2를 얻은 다음 다시 guru2를 얻습니다. 왜냐하면 스레드가 여기에서 1000밀리초 동안 휴면 상태이고 다음 guru1과 다시 guru1입니다. 스레드는 1000밀리초 동안 휴면 상태이므로 guru2를 얻은 다음 guru1을 얻습니다.
요약
이 튜토리얼에서는 멀티스레드 애플리케이션을 보았습니다. Java 단일 스레드와 다중 스레드를 사용하는 방법 Java.
- 멀티스레딩에 대해 설명해주세요 Java: 멀티스레딩에서는 스레드가 독립적이며 동시에 여러 작업을 수행할 수 있으므로 사용자가 차단되지 않습니다.
- 스레드의 수명주기의 다양한 단계는 다음과 같습니다.
- 신제품
- 실행 가능
- 달리는
- 기다리는
- 죽은
- 우리는 또한 다음에 대해 배웠습니다. 동기화 이는 애플리케이션이 원활하게 실행되는 데 도움이 됩니다.
- 멀티스레드 프로그래밍 Java 더 많은 응용 프로그램 작업을 더 쉽게 만듭니다.