1.13 thread

yeonseong Jo·2023년 5월 8일
0

SEB_BE_45

목록 보기
20/47
post-thumbnail

thread는 한국말로 실이다.


컴퓨터 견적 볼 때나 봤었던 이 thread는
java에서 말하는 thread와는 다른 것이다.

언젠가 본 적이 있는데,
cpu의 코어를 일하는 사람이라고 치면,
cpu의 thread는 일하는 사람의 손이라는 것이다.

gpt에도 물어보니
java와 cpu의 thread는 실제로 다른 개념이고,
cpu의 thread는 프로그래머가
직접 조작하기 어렵거나, 불가능하다고 한다.


process

process는 실행 중인 어플리케이션 하나이다.
이 process는
데이터,
컴퓨터 자원,
thread로 구성이 되는데,
여기서 thread는 데이터와 확보된 컴퓨터 자원을 활용하여
코드를 실행한다. 이는 코드 실행의 흐름이라고 볼 수 있다.

process에는 최소 하나의 thread가 존재하는데,
실제로 java에서
어디에서도 main method를 실행하지 않지만,
이 main method가 가장 먼저 작동되는 것을 보면
이를 이해할 수 있다.


thread


main thread

java 어플리케이션을 실행하면,
main thread가 main method를 실행한다.
main thread는 main method나 그 이하의 method에서
따로 다른 thread를 생성하고 실행이 가능하며,
이 때 생성된 thread는
병렬로 실행되거나 동시에 작업을 수행할 수 있다.

main thread의 종료는 어플리케이션의 종료를 의미하며,
실행 중인 모든 작업들이 즉시 종료된다.


thread 생성

thread의 생성방법은 4개가 있다.
1. Runnable 인터페이스 구현한 객체에서 thread를 생성하고 실행하는 방법
2. Thread 클래스를 상속받은 하위 클래스에서 thread를 생성하고 실행하는 방법
3. 익명 객체를 사용해 thread를 생성하고 실행하는 방법
4. 람다식을 사용해 thread를 생성하고 실행하는 방법

class Thread1 implements Runnable {
	public void run() {
    	...
    }
}

class Thread2 extends Thread {
	@Override
    public void run() {
    	...
    }
}
public class Main {
	public static void main(String[] args){
    	// thread1 객체 생성
    	Runnalbe t1 = new Thread1();
        Thread thread1 = new Thread(t1);
        
        // thread2 객체 생성
        Thread2 thread2 = new Thread2();
        
        // thread3_1 객체 생성
        Thread thread3_1 = new Thread(new Runnable() {
        public void run() {
        		...
        	}
		});
        // thread3_2 객체 생성
        Thread thread3_2 = new Thread() {
        	public void run(){
            	...
            }
        }
        // thread4 객체 생성
        Thread thread4 = new Thread(() -> {
        	...
        });
        
        //thread1 실행
        thread1.start();
        //thread2 실행
        thread2.start();
        //thread3_1 실행
        thread3_1.start();
        //thread3_2 실행
        thread3_2.start();
        //thread4 실행
        thread4.start();
    }
}

상황에 따라 사용하는 방법은 달라지겠지만,
다른 클래스를 상속하는 경우
Thread 클래스 상속이 안되기 때문에,
보통은 인터페이스를 구현하는 1번 방법을 많이 사용할 거 같다.


thread getter/setter

thread에도 getter/setter가 존재한다.

thread.getName();
thread.setName();

위와 같은 방법으로 호출이 가능하며,
디버깅 과정에 유용하게 사용할 수 있을거 같다.


synchronized/lock

main thread에서 여러 thread를 생성해서
multi thread 환경을 구축할 수 있듯이
일반 class에서도 여러 thread를 생성할 수 있다.

만약 실행하는 method에서
thread간에 공유하는 데이터를 다룰 때
문제가 생길 수 있다.
(thread들이 해당 값을 동시에 수정한다던가,
조건에 의해 실행 했지만, 다른 thread에 의해 조건을 충족못한다던가)

이런 경우 임계영역을 지정하여
한개의 접근 권한을 만들어
각 thread에게 한번 씩 접근 권한을 부여하는 방법이다.

class ForSync{
	// method 전체 임계영역 지정
	public synchronized void forSync1(){
    	...
    }
    // 특정 영역 임계영역 지정
    public void forSync2(){
    	synchronized (this){
          ...
       }
    }
}

위와 같이 두가지 방법이 존재하며

synchronized (this)

여기서 "this"를 lock이라고 한다.
synchronized 영역을 실행하고 있는 thread가
lock을 얻고 코드를 실행하게 된다.

profile
뒤(back)끝(end)있는 개발자

0개의 댓글