프로세스 내에서 "순차적으로 실행되는 실행 흐름"의 최소 단위 입니다.
여러 개의 프로그램을 동시에" 또는 "하나의 프로그램을 동시에 여러 개" 실행할 수 있게 해준다는 것이죠. 그리고 이렇게, 현재 메모리에 로딩되고 실행 중인 프로그램을 프로세스(Process) 라고 부릅니다. 즉 컴퓨터가 어떤 일을 하고 있는 상태를
'프로세스'라고 하죠.
프로세스를 활용할 때는 동시적, 병렬적으로 혼합으로 이루어집니다.
1. 동시성
A 조금 / B조금 /C조금씩 여러 작업을 돌아가면서 일부분 진행하는것이고
2. 병렬성
프로세스 하나에 코러 여러 개가 달려서 각각 동시에 작업들을 수행하는 것입니다.
ex) 듀얼코어/ 쿼드코어/ 옥타코어 등등 쓰는이유는 CPU의 속도가 발열 및 물리적 제약때문에 여러 코어을 붙인것 입니다.
Thread(쓰레드)
우리가 Chrome을 사용 할 때 게임을 다운받으면서 유투브를 사용 할 수 있어야 하고 유투브를 보면서 대학 강의도 볼 수 있어야 합니다 . 이렇게 한 프로세스 내에서 여러 갈래의 작업들이 동시에 진행되는 과정이 쓰레드 입니다.
<좀 더 이해하기 쉽게>
프로세서 => 요리사
대량 주문 => 프로세스 ex( 라면 끓이기, 김밥 말기 , 햄버거 만들기)
컴퓨터는 프로세스마다 자원을 분할해서 할당합니다.
라면 섹션 , 김밥 섹션 , 햄버거 섹션 (이 섹션을 병렬적으로 하든 ,섞어서 하든)
이 메뉴들을 계속해서 동시에 만들어 갑니다.
프로세스 안에서 공유되는 변수에
쓰레드 두 개가 동시에 손을 대면 컴퓨터에서는 Error가 발생한다 WHY?
컴퓨터는 같은 자원을 동시에 누르면서 숫자가 2가 아닌 1이 증가하기 때문이다
ex) 입금/ 출금
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);
}
}