JAVA/강의

JAVA 15일차 강의 - 스레드

record2080 2025. 3. 4. 00:26

ctrl + alt + delete = 작업관리자

프로세스 ,스레드 <<< 자원 (리소스,cpu , 메모리(공간)을 할당받으면 O)

그 프로세스에서 실제로 일하고 있음>>스레드가!

 

스레드를 구현하는 하는 방법 1

//Thread 클래스를 상속 받아오기

스레드의 가장 이슈포인트는 run이다

class TestThread extends Thread {
	@Override
	public void run() {
		for(int i=1;i<=10;i++) {
			System.out.println(i+". 스레드 클래스를 상속받아 만들었습니다.");
		}
	}
}

public class Practice {
	public static void main(String[] args) {
		TestThread tt=new TestThread();
		tt.start();
	}
}

 

사용자가 더블클릭하면 스레드가 런해서 출력

 

스레드를 구현하는 방법 2

//인터페이스를 구현하는 방법

인터페이스는 스레드가 아니다

인터페이스를 구현하는 것만으로는 스레드라곤 할 수 없으며 진짜 스레드에 내가 만든 스레드를 넣어서 사용해야 한다

 

tt.start();
 t.start();
스레드에서 시키는 게 아니라 프로세스에서 실행
스레드가 명령을 받는 일은 독자적인 행동
인터페이스가 나중에 실현되었지만 먼저 나올 수 있다

내부적으로 메모리가 어떻게 할당될지는 개발자가 모르는 부분
컴퓨터의 내부시스템에 달려있다.

 

예) 자바스크립트의 경우 , 먼저 코드를 작성해도 먼저 작성된 코드가 안 될 수도 있다.
순서를 조정할 순 없다. 
왜??cpu의 영역이기 때문에 
thread.sleep(1000); 그냥 시간으로 맞춤

 

스레드 코딩의 문제점
티켓팅 공간은 하나고
사람은 세명
티켓은 공유자원

★공유자원에 누군가 접근했다면 다른 스레드(프로세스)의 접근을 막아야 한다
공유자원에 접근할 수 있는 메서드
synchronized  void pay() //동기화 설정 ★
사고가 일어나는 것을 방지할 수 있다
오버보팅등의 문제 등

 

class Ticketting {
	static int ticket = 2;
	synchronized void pay() { // 동기화 설정 ★ 중요!!
		if(Ticketting.ticket<=0) {
			System.out.println("티겟구매실패");
			return;
		}
		Ticketting.ticket--;
		System.out.println("티켓구매성공");
	}
}
class Person implements Runnable {
	Ticketting t;
	Person(Ticketting t){
		this.t=t;
	}
	@Override
	public void run() {
		t.pay();
	}	
}
public class Practice {
	public static void main(String[] args) {
		Ticketting t=new Ticketting();

		Thread t1=new Thread(new Person(t));
		Thread t2=new Thread(new Person(t));
		Thread t3=new Thread(new Person(t));
		
		t1.start();
		t2.start();
		t3.start();