Thread(쓰레드) 그게 뭐야?

푸른하늘·2021년 12월 19일
0

Thread란

프로세스 내에서 "순차적으로 실행되는 실행 흐름"의 최소 단위 입니다.

프로세스?

여러 개의 프로그램을 동시에" 또는 "하나의 프로그램을 동시에 여러 개" 실행할 수 있게 해준다는 것이죠. 그리고 이렇게, 현재 메모리에 로딩되고 실행 중인 프로그램을 프로세스(Process) 라고 부릅니다. 즉 컴퓨터가 어떤 일을 하고 있는 상태를
'프로세스'라고 하죠.

프로세스

프로세스를 활용할 때는 동시적, 병렬적으로 혼합으로 이루어집니다.
1. 동시성
A 조금 / B조금 /C조금씩 여러 작업을 돌아가면서 일부분 진행하는것이고

2. 병렬성
프로세스 하나에 코러 여러 개가 달려서 각각 동시에 작업들을 수행하는 것입니다.
ex) 듀얼코어/ 쿼드코어/ 옥타코어 등등 쓰는이유는 CPU의 속도가 발열 및 물리적 제약때문에 여러 코어을 붙인것 입니다.

Thread(쓰레드)

우리가 Chrome을 사용 할 때 게임을 다운받으면서 유투브를 사용 할 수 있어야 하고 유투브를 보면서 대학 강의도 볼 수 있어야 합니다 . 이렇게 한 프로세스 내에서 여러 갈래의 작업들이 동시에 진행되는 과정이 쓰레드 입니다.

<좀 더 이해하기 쉽게>
프로세서 => 요리사
대량 주문 => 프로세스 ex( 라면 끓이기, 김밥 말기 , 햄버거 만들기)

컴퓨터는 프로세스마다 자원을 분할해서 할당합니다.
라면 섹션 , 김밥 섹션 , 햄버거 섹션 (이 섹션을 병렬적으로 하든 ,섞어서 하든)
이 메뉴들을 계속해서 동시에 만들어 갑니다.

프로세스 안에서 공유되는 변수에
쓰레드 두 개가 동시에 손을 대면 컴퓨터에서는 Error가 발생한다 WHY?

컴퓨터는 같은 자원을 동시에 누르면서 숫자가 2가 아닌 1이 증가하기 때문이다
ex) 입금/ 출금

라면을 동시에 4개 끓이는 Thread(JAVA) 코드

import java.util.Scanner;



public class RamenProgram 
{



	public static void main(String[] args) 
	{
		int num;
		Scanner input = new Scanner(System.in);
		
		System.out.println("라면 몇 개 끓일까요?");
		
		num = input.nextInt();
		
		System.out.println(num + "개 주문 완료! 조리시작!");
		try
		{
			RamenCook ramenCook = new RamenCook(num);
			new Thread(ramenCook,"A").start();
			new Thread(ramenCook,"B").start();
			new Thread(ramenCook,"C").start();
			new Thread(ramenCook,"D").start();
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}

	}

}



interface Runnable
{
	public void run();
}


class currentThread extends Thread
{
	public RamenCook ramenCook;
	static String nam;
	
	currentThread()
	{
		this(new RamenCook(5) , "");
	}
	
	currentThread(RamenCook ramenCook , String nam)
	{
		this.ramenCook = ramenCook;
		this.nam = nam;
	}
}



class RamenCook extends Thread implements Runnable
{
	private int ramenCount;
	private String[] burners = {"_","_","_","_"};
	
	public RamenCook(int count)
	{
		ramenCount = count;
	}
	
	@Override
	public void run()
	{
		while(ramenCount > 0)
		{
			synchronized(this)
			{
				ramenCount--;
				System.out.println(Thread.currentThread().getName() + " : " + ramenCount + "개 남았습니다");
			}
			
			for(int i = 0; i < burners.length; i++)
			{
				if(!burners[i].equals("_"))
				{
					continue;
				}
				
				synchronized(this)
				{
					//if(burners[i].equals("_"))
					//{
						burners[i] = Thread.currentThread().getName();
						System.out.println("                 " + Thread.currentThread().getName() + " : [" + (i + 1) + "]번 버너 ON");
						showBurners();
					//}
				}
				
				try
				{
					Thread.sleep(2000);	
				}
				catch(Exception e)
				{
					e.printStackTrace();
				}
				
				synchronized(this)
				{
					burners[i] = "_";
					System.out.println("                                  " + Thread.currentThread().getName() + " : [" + (i + 1) + "]번 버너 OFF" );
					showBurners();
				}
				break;
			}
			
			try
			{
				Thread.sleep(Math.round(1000 * Math.random()));
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
		}
	}
	
	private void showBurners()
	{
		String stringToPrint = "                                                             ";
		for(int i = 0; i < burners.length; i++)
		{
			stringToPrint += (" " + burners[i]);
		}
		System.out.println(stringToPrint);
	}


}

더 알고 싶으면 이쪽으로

profile
Developer-Android-CK

0개의 댓글