[Java] 멀티쓰레드

Junseo Kim·2019년 12월 21일
0

[Java]자바 기초

목록 보기
13/35

쓰레드

프로그램의 하나의 흐름. 일을 처리하는 사람
프로그램이 시작되면 os가 프로그램에 허가를 주고, 쓰레드가 부여된다.
이때까지 코딩한 것들은 전부 단일쓰레드 프로그래밍이다.

단일 쓰레드 프로그래밍의 문제점

무언가를 하고 있으면 다른 것을 할 수 없다.(동시에 어떤 일을 할 수 없다.)

ex. 게임에서 만약 쓰레드가 하나일 경우, 내 캐릭터만 움직이고, 다른 유저의 캐릭터는 내 캐릭터가 움직일 때만 움직이던지 아니면 아에 움직일 수 없다.

멀티쓰레드 프로그래밍

Runnable: 실행 가능 한. 시킬 일.
Thread: 흐름. 해야할 일.

<선언>

Runnable 변수이름 = new Runnable() {
			
	@Override
	public void run() {
				
				
	}
};
Thread 변수이름 = new Thread(Runnable값);

ex.

		Runnable todo = new Runnable() {
			
			@Override
			public void run() {
				 
			}
		};
        Thread thread = new Thread(todo);

Tip) Override
기존에 있는 코드들을 계승받아서, 한 번더 업그레이드 시켜줌.

간단한 멀티쓰레드 프로그래밍

public static void main(String[] args) {
		
		for (int i = 0; i < 60; i++) {
			System.out.println("첫 번째 쓰레드: " + i);

			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
		Runnable todo = new Runnable() {
			@Override
			public void run() {
				for (int i = 0; i < 60; i++) {
					System.out.println("두 번째 쓰레드: " + i);

					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				
			}
		};
		Thread thread = new Thread(todo);
		thread.start();
	}

Tip) Thread.sleep(1000)은 1초간 딜레이를 주는 것이다.
Tip) Runnable 값을 넣어준 thread를 실행시킬 땐 .start()를 사용한다.

But, 위와 같은 코드를 실행하여도 동시에 두 개의 쓰레드가 실행되지 않고, 첫 번째 쓰레드가 모두 실행된 후, 두 번째 쓰레드가 실행된다. 왜냐하면, 새로운 쓰레드를 만들어주는 코드 위에 첫 번째(메인)쓰레드가 실행되고 있으므로, Thread thread를 만나기 전까지는 단일쓰레드 프로그램이랑 같기 때문이다. 따라서 순서를 바꿔준다.

public static void main(String[] args) {
		
		Runnable todo = new Runnable() {
			@Override
			public void run() {
				for (int i = 0; i < 60; i++) {
					System.out.println("두 번째 쓰레드: " + i);

					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				
			}
		};
		Thread thread = new Thread(todo);
		thread.start();
		
		for (int i = 0; i < 60; i++) {
			System.out.println("첫 번째 쓰레드: " + i);

			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}


제대로 메인쓰레드와, 백그라운드쓰레드가 동시에 돌아가는 것을 볼 수 있다.

Tip) Thread thread = new Thread()로 돌아가는 쓰레드가 백그라운드 쓰레드이고, 우리가 일반적으로 코딩하던 부분은 메인쓰레드이다.

0개의 댓글