스레드
- 프로그램 실행의 기본 단위로, 하나의 프로세스 내에서 독립적으로 실행될 수 있는 흐름
- 프로세스 내에서 각각의 독립적인 작업을 수행하며, 여러 스레드가 동시에 실행
- 여러 작업을 병렬로 실행하거나, 프로그램의 반응성을 높이는 등의 다양한 목적으로 활용
- 이미 JAVA에서 구현한 Thread 클래스를 가져다가 사용
📍 스레드 생명주기
스레드 객체가 생성이 되면, 즉시 대기 → 수행 → 데드
ex)
Th01 t1 = new Th01(); → 대기 → start() ... run() → 데드
start() 스레드 객체야, 일해! -> run()메서드를 실행시켜 수행하게 됨
📌 Thread 구현 방법
- 스레드 상속
class 클래스명 extends Thread{ @Override // run() 필수로 생성 : main()에서 start() 시 run 안에 넣은 메서드가 실행 }
- 스레드 상속 받은 클래스 객체화
클래스명 변수명 = new 클래스명(); 생성 - 변수명.start();
수행하고 완료되면 데드 상태가 된다.
ex)
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(); // 스레드 객체야, 일해!
t2.start(); // -> run()메서드를 실행시킴
// start()로 인해 run()을 수행하게 되고,
// 주어진 run()을 수행하게 되면
// => 데드 상태가 됨
// 스레드 객체들은 현재 독립적으로 일을 수행하고 있구나!
// 스레드 생명주기(라이프사이클)
// 생성 -> 대기 -> 수행 -> 데드
// 블록 : 자원(메모리)을 할당 받지 못하도록 막아둔 상태
for(int i=0;i<=10;i++) {
System.out.println(i); // 1000 == 1초
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
✅ synchronized : 동기화
- 내가 사용하는 동안 접근하지마
- 메서드 앞에 붙여주면 동기화 기능
synchronized void 메서드명(){
Thread.currentThread().get() // 스레드로 객체 생성 시 스레드 객체에 있는 이름을 받아옴
}
ex) 주로 은행, 영화관, 티켓판매 하는 곳에서 사용하는 기능
누군가가 먼저 영화관 자리를 구매중일 때는 다른 사람이 구매하지 못하도록 막혀있다.
ex)
package class01;
class Family extends Thread{
Account a=new Account();
@Override
public void run() {
a.use();
}
}
class Account{
static int money=10000; // 공유자원 돈
synchronized void use() { // 동기화 : 내가 쓰는 동안은 접근하지마
if(money>=5000) {
System.out.println(Thread.currentThread().getName()+" 인출성공!");
// 스레드가 멤버변수로 이름을 갖고 있다
// 스레드 객체에 있는 이름을 받아옴
/*
class Thread{
private String name;
Thread(){
this(new Thread(),null);
}
Thread(Thread thread,String name){
this.name=name;
}
getter,setter{
}
*/
money-=5000;
}
else {
System.out.println(Thread.currentThread().getName()+" 인출실패..");
}
System.out.println("남은 돈: "+money);
}
}
public class Test03 {
public static void main(String[] args) {
Family f=new Family();
Thread t1=new Thread(f,"엄마");
Thread t2=new Thread(f,"아빠");
Thread t3=new Thread(f,"나");
t1.start();
t2.start();
t3.start();
}
}
'Language > JAVA' 카테고리의 다른 글
[JAVA 기초 이론] MVC패턴 (0) | 2023.05.24 |
---|---|
[JAVA 기초 이론] 집합 Set (0) | 2023.05.22 |
[JAVA 기초 이론] 오버로딩 / 오버라이딩 (0) | 2023.05.22 |
[JAVA 기초 이론] 예외처리 try / catch / finally (0) | 2023.05.21 |
[JAVA 기초 이론] 추상클래스 abstract (0) | 2023.05.19 |