Notice
Recent Posts
Recent Comments
Link
개발 무지렁이
[Java] 하나의 프로세스 안의 멀티스레드(메인스레드 + 多 작업스레드)의 구현 본문
𐂂 운영체제(os)는 실행중인 프로그램을 프로세스로 관리한다.
운영체제는 멀티프로세스를 생성해서 처리하지만,
하나의 프로세스 내에서 멀티태스킹을 할 수도 있다.
하나의 프로세스가 두가지 이상의 작업을 처리할 수 있는 이유는 멀티스레드가 있기 때문이다.
하나의 프로세스 내에서 멀티태스킹을 할 수도 있다.
하나의 프로세스가 두가지 이상의 작업을 처리할 수 있는 이유는 멀티스레드가 있기 때문이다.
𐁍 '스레드' 란
코드의 실행흐름을 말한다.
멀티스레드는 하나의 프로세스 내부에서 생성되기 때문에
하나의 스레드가 예외를 발생시키면, 프로세스가 종료되므로
다른 스레드에 영향을 미친다.
⚠️ 멀티스레드를 사용하는 경우 예외처리에 신경써야한다.
⚠️ 멀티스레드에서는 실행 중인 스레드가 하나라도 있다면, 프로세스는 종료되지 않는다.
멀티스레드는 하나의 프로세스 내부에서 생성되기 때문에
하나의 스레드가 예외를 발생시키면, 프로세스가 종료되므로
다른 스레드에 영향을 미친다.
⚠️ 멀티스레드를 사용하는 경우 예외처리에 신경써야한다.
⚠️ 멀티스레드에서는 실행 중인 스레드가 하나라도 있다면, 프로세스는 종료되지 않는다.
➼ 🦔 모든 자바 프로그램은 메인스레드가 main메서드를 실행하면서 시작된다.
멀티스레드로 실행하는 프로그램을 개발하려면
먼저, 몇개의 작업을 병렬로 실행할지 결정하고,
각자 작업별로 스레드를 생성해한다.
먼저, 몇개의 작업을 병렬로 실행할지 결정하고,
각자 작업별로 스레드를 생성해한다.
𖠃 작업스레드도 객체로 관리된다.
🪡 Thread클래스로 직접생성 (java.lang)
=> Runnable 구현객체를 매개변수로 가지는 Thread 생성자를 호출한다.
(Runnable은 스레드가 작업을 실행할 때 사용하는 인터페이스를 말한다.)
=> Runnable 인터페이스에 정의된 run()메서드를 오버라이딩하여, 스레드가 실행할 코드를 넣는다.
=> Runnable 구현객체를 매개변수로 가지는 Thread 생성자를 호출한다.
(Runnable은 스레드가 작업을 실행할 때 사용하는 인터페이스를 말한다.)
=> Runnable 인터페이스에 정의된 run()메서드를 오버라이딩하여, 스레드가 실행할 코드를 넣는다.
class Task implements Runnable {
@Override
public void run() {
//스레드가 실행할 코드
}
}
Runnable task = new Task();
Thread thread = new Thread(task);
thread.start();// run()메서드 실행 -> 작업처리(작업스레드 실행)
🤡 사실 Thread 클래스 안에도 run() 메서드가 정의되어 있다.
하지만 굳이 Runnable 인터페이스를 구현한 객체를 스레드 생성자의 매개변수로 전달해서 사용하는 이유는
스레드 작업과 스레드 자체의 역할을 분리하여 더 구조적으로 관리할 수 있기 때문이다.
하지만 굳이 Runnable 인터페이스를 구현한 객체를 스레드 생성자의 매개변수로 전달해서 사용하는 이유는
스레드 작업과 스레드 자체의 역할을 분리하여 더 구조적으로 관리할 수 있기 때문이다.
𖠃 Runnable 익명 구현 객체를 매개변수로 사용하기 (권장, 간편해서)
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
//스레드가 실행할 코드
}
});
thread.start();
📜 PrintingABExample.java
public class PrintABExample {
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
for(int i = 0; i < 3; i++) {
System.out.println("B");
try {
Thread.sleep(500);
} catch (Exception e) { }
}
}
});
//작업스레드 - Printing "B"
thread.start();
//메인스레드 - Printing "A"
for(int i = 0; i < 3; i++) {
System.out.println("A");
try {
Thread.sleep(500);
} catch (Exception e) { }
}
}
}
// A
// B
// B
// A
// B
// A
'Backend > 자바' 카테고리의 다른 글
[Java] 공유객체 내부데이터에 대한 스레드 동기화와 정확한 작업교대 (0) | 2023.08.13 |
---|---|
[Java] CPU스케쥴링에 따른 스레드(Thread) 상태와 상태 이동 메서드 (0) | 2023.08.12 |
[Java] 타입파라미터를 가지는 제네릭 타입 및 제네릭 메서드 (0) | 2023.08.12 |
[Java] 어노테이션과 어노테이션 적용대상 및 유지정책 (0) | 2023.08.12 |
[Java] 메타정보를 관리하는 Class객체, 리플렉션을 통한 리소스 경로 얻기 (0) | 2023.08.11 |
Comments