일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 웹 브라우저 전쟁
- HTML역사
- DoitSQL
- 데이터베이스
- SQL입문
- DoIt
- 자바 오류
- 웹브라우저 수용도
- 예외
- 자바 예외
- 크롤링
- 생성자
- SQL
- R1C3
- 함수
- 숫자형식오류
- html
- 키-값 데이터베이스
- 배열 예제
- 페이지분석
- 배열 3요소
- 우아한테크
- Doit입문SQL
- 자바
- dbms
- 함수 선언
- DoitSQL입문
- 크롤링 오류
- 숫자 형식
- 예제
- Today
- Total
프로그래밍
[자바 기초] day14 : 스레드(Tread) 본문
2023.05.22.월
스레드
메모리를 할당받은 프로세스에서 실질적인 작업을 수행하는 주체
프로세스
실행중인 프로그램
프로그램 --> 실행 상태 --> 프로세스 순으로 진행되며
일(동작)할 수 있게 메모리(자원)을 할당받은 상태이다
프로세스가 진행되는 방식
선점형 방식: 우선순위대로 자원을 할당받아 진행되는 방식
->기아현상 발생 가능성 있다
시분할 방식: 시간을 동일하게 배분하여 골고루 실행될 수 있도록 진행하는 방식
-> 기존의 선점형 방식에서 우선순위가 낮아 오래 기다린 프로세스의 우선순위를 높여준다
이러한 프로세스 진행은 OS(운영체제)의 스케줄러가 담당한다
스레드의 생명주기
스레드는 생명주기에 맞게 실행된다
- 생성
- 대기
- 수행
- 데드
스레드를 실행시 run() 메서드가 실행된다
스레드는 생성 휴 즉시 대기 상태가 되며 대기상태는 수행 직전까지 유지된다
스래드가 해당 일을 수행한 후 데드 상태가 되어 가진 자원을 반환한다
이때 주의할 점은 스레드 객체들은 독립적으로 일을 수행하므로
스레드끼리의 순서가 정해져 있지 않다
이러한 상황에서 스레드를 조절하기 위해
블록처리를 할 수 있다
스레드 블록처리
자원(메모리)을 할당받지 못하도록 막아둔 상태
예제)
package class01;
// 이미 자바에서 구현한 스래드 클래스 가져다가 사용
// 코드를 재사용할 예정
// 상속
class Th01 extends Thread{
@Override
public void run() {
for(int i = 0; i<=10; i++) {
System.out.println("Thread 01 " +i);
}
}
}
class Th02 extends Thread{
@Override
public void run() {
for(int i = 0; i<=10; i++) {
System.out.println("Thread 02 " +i);
}
}
}
public class Test01 {
public static void main(String[] args) {
// 생성
Th01 t1 = new Th01();
Th02 t2 = new Th02();
//대기
//수행
t1.start(); // 스레드 실행 -> run()메서드 실행
t2.start();
// 블록: 자원(메모리)을 할당받지 못하도록 막아둔 상태
for(int i=0; i<10; i++) {
System.out.println(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
} // 1000 == 1초
}
}
}
이미 자바에서 스레드 클래스를 구현해 놓았기 때문에 손쉽게 상속받아 사용할 수 있다
동기화
스레드는 독립적으로 실행되기 때문에
공유자원을 어떤 스레드가 점유하고 있을때'
다른 스레드의 접근을 막아야 한다.
package class01;
class Person extends Thread {
Ticketting t = new Ticketting(); // 설명을 위해 클래스내에서 선언
@Override
public void run() {
t.pay();
}
}
class Ticketting {
static int ticket = 2; // 공유자원, 클래스 변수
synchronized void pay() {
if(ticket>0) {
System.out.println(Thread.currentThread().getName()+" 구매 성공!");
ticket--;
}
else {
System.out.println(Thread.currentThread().getName()+" 구매 실패");
}
System.out.println("남은 티켓: "+ticket);
}
}
public class Test02 {
public static void main(String[] args) {
Person p =new Person();
Thread t1 = new Thread(p, "홍길동"); //각 사람마다 2개로 보임
Thread t2 = new Thread(p, "아무무");
Thread t3 = new Thread(p, "티모");
t1.start();
t2.start();
t3.start();
}
}
위의 코드를 통해 다음과 같은 추론을 할 수 있다.
자바의 Thread 클래스에는
- 멤버변수 name을 가지고 있다
- 멤버변수 name은 private 접근제한자로 선언되어있다
- 기본생성자가 있다
- 스레드 객체와 이름을 받는 생성자가 있다
class Thread{
private String name;
Thread(){
this(new Thread(),null);
}
Thread(Thread thread,String name){
this.name=name;
}
getter,setter
}
따라서 위와 같은 형태를 예측할 수 있다
(실제론 더욱 복잡하다)
'자바 > 자바 기초' 카테고리의 다른 글
[자바 기초] day14 : 파일입출력 예제(사진 복사하기) (0) | 2023.05.22 |
---|---|
[자바 기초] day14 : 파일입출력 (0) | 2023.05.22 |
[자바 기초] day13 : 예외와 예외처리 (1) | 2023.05.19 |
[자바 기초] day12 : 컬렉션 프레임워크 (0) | 2023.05.19 |
[자바 기초] day11 : 추상화/ 캡슐화 예제 (0) | 2023.05.18 |