Thread에 대해 알아보고 자바를 사용해서 실습해보자!

박경현·2023년 5월 19일
0

문득 자바강의를 보는데 스레드가 뭘까? 라는 생각이 들었다

바로 답하지 못하고 생각만 하다 말 못한 용어여서 열심히 다시 공부해서
여기 기록으로 남기려고 한다!

Thread 란?

운영체제에서 프로세서와 스레드에 대해 헷갈릴때가 많다

현재 돌아가는 프로그램들을 프로세서라고 하는 것이고
프로세스 안에서 동작을 실행하는게 스레드이다!!

스레드 -> 하나의 실행 흐름을 가짐! 코드를 실행하는 것

ex) 윈도우에서 여러개 창 실행 -> 이건 멀티 프로세서!!

멀티쓰레드

어려워 보이는 용어 였는데 전혀 어렵지 않은 용어다!

하나의 프로세서 안에서 하나의 스레드만 돌면 싱글 쓰레드!
프로세스 안에서 여러개의 쓰레드가 돌면 멀티 쓰레드이다

하나의 프로세서 안에서 여러개의 작업을 동시 처리!! => 이게 멀티 스레드다!
ex) 음악프로그램에서 검색하면서 음악듣기

멀티프로세스와 멀티쓰레드의 특징 && 언제 써야하는지

멀티프로세스는 프로세스끼리 독립적이어서 영향을 안준다!

크롬이 오류라고 계산기가 안되지는 않는다!

하지만 멀티 쓰레드는 하나의 프로세스 내에서의 여러 실행 동작이기에
하나만이라도 안되면 프로세스가 멈춰서 모든 쓰레드가 멈춘다!!

멀티쓰레드를 언제 써야할까?

데이터를 분할해서 병렬 처리할 때 -> 주로 게임에서 채팅치면서 게임 등 이럴때 많이 사용!

자바에서 메인스레드와 작업 스레드

JVM은 기본적으로 메인 스레드 하나를 싱글스레드로 실행해줌!

싱글스레드는 언제 종료 될까? -> 메인스레드 종료되면 프로세스도 종료!

멀티쓰레드는 언제 종료 될까? -> 모든 쓰레드가 종료되야 프로세스도 종료!

작업쓰레드 만들어서 실습해보자!

Runnable 인터페이스를 구체화해서 만드는 방식

public class BeepPrintExample {
	public static void main(String[] args) {
    	Thread thread = new Thread( new Runnable() { 
        	@Override
            public void run() {
            	Toolkit toolkit = Toolkit.getDefaultToolkit();
            	for(int i=0; i<5; i++) {
            		toolkit.beep();
                	try {
                		Thread.sleep(1000); // 1초
                	} catch (IntrerruptedException e) {}
            	}	
            }
        }, "beepThread");
        
        thread.start();
        System.out.println(thread.getName());
        
        // 아래 코드와 동시에 실행!
        for(int i =0; i<5; i++) {
            System.out.println("띵");
            try {
                Thread.sleep(1000);
            }catch (InterruptedException e) {
            }
        }
        
    }
}

여기 위에 코드를 보면 작업 스레드로 beepThread를 만들었다!
@Override한 run 메소드에 작업 스레드로 실행할 내용들을 적어주면 된다!

그리고 start()메소드를 적어주면 작업 스레드도 드디어 실행된다!

그리고 아래에 for문을 반복시켜서 메인스레드가 일하는 동시에 작업쓰레드도 일하게 만들었다!

스레드 상태

그렇다면 start를 누르면 작업스레드가 바로 실행될까?

정답은 실행대기 상태로 들어간다가 정확한 답이다

왜 바로 실행 안하고 대기할까?
cpu의 자원은 한정되어있고 이미 다른 프로세스를 통해 사용중일 수도 있다!!
그래서 일단 대기 하고 실행조건이 충족되면 그때 실행된다!

스레드의 4가지 상태

일단 new로 스레드 객체를 생성

스레드는 실행대기와 실행상태를 번갈아가면서 자신의 run메소드를 실행함!(cpu가 정한 시간 지나면 실행대기로 돌아감!)

작업이 다 끝나면 종료됨! (Terminated)

일시정지 -> thread.sleep 처럼 잠깐 멈추고 싶다면 사용!, 그 후는 실행대기로 돌아간다!

profile
SW로 문제를 해결하려는 열정만 있는 대학생

0개의 댓글