티스토리 뷰
멀티태스킹
- 동시에 두 가지 이상의 작업을 처리하는 것
- 멀티태스킹을 위한 두 가지 도구 : 프로세스, 스레드 (하나의 프로세스는 적어도 한개의 스레드를 가짐)
프로그램
- 파일이 존재하지만 아직 메모리에 올라가 있지 않은 상태
- 실행되지 않은 코드의 집합
- os의 메모리에 올라간 것
프로세스
- 프로그램을 실행하는 순간 메모리에 올라가고 동작하는 상태의 프로그램
- 독립적으로 메모리에 등록된다.(스레드가 여러 개) => 여러 개의 프로그램을 동시 실행 가능
- 각각의 프로세스들은 독립적으로 등록되어 서로 간섭할 수 없다.
- 1개의 스레드를 가지면 구동 스레드라고 한다.
스레드
- 프로세스 내부에 존재하면서 실행 흐름을 나타내는 것
- 스레드는 순서가 없이 작업한다.
- 멀티스레드 : 여러 개의 스레드를 이용해 동시에 작업을 수행
- 사용방법
1. Thread 클래스를 상속해 run()메서드 구현
MyThread thread = new MyThread();
public class MyThread extends Thread{
//스레드가 시작(.start())되면 자동으로 실행되는 메서드
public void run() {
int sum = 0;
for(int i = 1; i <= 100; i++) {
sum += i;
}
System.out.println(sum);
String threadName = Thread.currentThread().getName();
System.out.println(threadName);
}
}
public class Main {
public static void main(String[] args) {
MyThread thread = new MyThread();
//이름부여
thread.setName("더하기");
//스레드 시작
thread.start();
//살아있는지 확인
System.out.println(thread.isAlive());
}
}
- 직접 생성한 스레드는 Thread-n이라는 이름으로 자동 설정된다.
- setName() //이름을 변경할 때
- getName() //이름을 호출할 때
2. Runnable 인터페이스 구현( +람다식 사용)
-Runnable 인터페이스는 추상메서드 run() 하나 만을 가짐
Thread th = new Thread(Runnable을 상속한 인스턴스);
-Runnable을 상속해 만든 객체는 Thread객체에 넣어서 실행해야함
public class Flag implements Runnable{
@Override
public void run() {
for(int i = 0; i < 10; i++) {
if(i % 2 == 0) {
System.out.println("백기 올려");
}
else {
System.out.println("청기 올려");
}
}
}
}
public class FlagMain {
public static void main(String[] args) {
Flag flag = new Flag();
Thread thFlag = new Thread(flag);
thFlag.start();
//익명 클래스 람다식으로 구현
Runnable rn = () -> {
for(int i = 1; i < 10; i++) {
if(i % 2 == 1) {
System.out.println("백기 올려!");
}
else {
System.out.println("청기 올려!");
}
}
};
Thread thFlag2 = new Thread(rn);
thFlag2.start();
}
}
- thread.start() //스레드 시작
스레드 동기화(synchronized)
- 여러 스레드가 하나의 공유 데이터에 동시에 접근하지 못하도록 스레드의 실행을 제어하는 것
- 임계 영역 : 멀티 스레드 프로그램에서 단 하나의 스레드만 처리할 수 있는 영역
- 동기화 처리 : 하나의 스레드가 임계영역에 진입할 때 락을 걸어 다른 스레드가 수행되지 못하게 하고 작업이 종료되면 락을 풀어 다른 스레드가 작업하도록 하는 것
메서드 동기화 처리
- 메서드 이름 앞에 synchronized 키워드를 붙인다.
- 해당 메서드 전체 동기화 => 메서드 처리 시간이 길어지면 성능이 떨어진다.
- 순서대로 처리하진 않지만 서로 간섭할 수 없다.
public synchronized void add() ..
블록 동기화 처리
- 특정 영역만 동기화 처리
- 실제 실행하는 스레드의 일부분을 동기화하여 처리하는 방법
synchronized(객체명)
- 공유 중인 객체를 소괄호에 명시
스레드 상태
- 스레드 상태 확인 : Thread.State
상태 | 상수 | 설명 |
생성 | NEW | 스레드 객체가 생성되었지만 start() 메서드가 호출되지 않은 상태 |
대기 | RUNNABLE | 실행 대기 또는 실행 상태 언제든지 갈 수 있는 상태(실행 직전) |
일시정지 | WATING | 다른 스레드가 종료될 때까지 대기하는 상태(시간x) |
TIMED_WATING | 주어진 시간 동안 대기하는 상태 | |
BLOCKED | 락이 풀릴 때까지 대기하는 상태 | |
종료 | TERMINATED | 수행을 종료한 상태 |
- wait() : 스레드 대기
- notify : 대기 중인 스레드를 다시 동작 시킴
- sleep() : 주어진 시간 동안 스레드를 정지시키는 메서드
'JAVA' 카테고리의 다른 글
[Java] 제네릭, 박싱, 언박싱, Wrapper 클래스 (0) | 2024.06.04 |
---|---|
lombok 자바 라이브러리, Intellij (1) | 2024.05.31 |
[JAVA] 람다식, 함수형 인터페이스 (0) | 2024.04.10 |
[JAVA] ch.16 컬렉션 프레임워크, List, Set, Map, 제네릭, Iterator (0) | 2024.04.09 |
[JAVA] ch.15 API 클래스 (0) | 2024.04.08 |
- Total
- Today
- Yesterday
- getter
- 자바 출력문
- Arrays클래스
- 생성자
- 배열
- 부호 연산자
- 복합 대입 연산자
- 변수
- 오라클
- 깊은복사
- 자바 자료형
- 관계 연산자
- 서식문자
- 얕은복사
- dbms
- 자료형
- 메서드
- this
- 비트 연산자
- SETTER
- 논리 연산자
- 제어문자
- 삼항 연산자
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |