본문 바로가기

자바 웹 개발자가 될거야/JAVA

[JAVA] 멀티스레드 / 멀티스레드로 구구단 구현

 

< 멀티스레드 >

 

- 하나의 프로세스가 두 가지 이상의 작업을 처리하는 것

- 스레드란 ?  프로세스 내부에서 코드의 실행 흐름을 말함

- 하나의 프로그램 안에 여러 개의 스레드를 둘 수 있음

- 메인 메서드도 하나의 스레드로 취급

- 하나의 스레드가 예외를 발생시키면 프로세스 자체가 종료될 수 있어 다른 스레드에 영향을 미침

 

 

① 멀티 프로세스와 멀티 스레드 차이

 

- 멀티 프로세스 

  · 자신의 메모리를 가지고 실행하므로 서로 독립적

  · ex) 엑셀과 한글 프로그램을 동시에 사용하는 것

 

- 멀티 스레드

  · 하나의 프로세스 내부에 생성되므로 서로 독립적이지 않음

  · ex) 메신저 프로그램 안에서 채팅기능과 동시에 파일 전송 기능 수행

 

 

② 스레드를 만드는 방법

 

- Runnable(인터페이스)로 만듦

  · void run() 메서드 가짐

 

public interface Runnable{
	public void run();
}

class MyRunnable implements Runnable {
	@Override
    public void run(){ ... }
}

public static void main(String[] args) {
	// 독립된 클래스로 Runnable 구현
	Thread t1 = new Thread(new MyRunnable());
	t1.start();
    
	// 익명의 클래스로 Runnable 구현
	Thread t2 = new Thread(new Runnable(){
		@Override
		public void run(){ ... }    
	});
	t2.start();
    
	// 람다로 Runnable 구현
	Thread t3 = new Thread(()->{ ... }
	);
	t3.start();
    
}

  

  · thread명 . start(); 로 스레드 시작시켜줌

 

- 상속받아서 만듦

 

class MyThread extends Thread {
	@Override
    public void run(){
    	...
    }
}

 

 

 

② 구구단 스레드 만들기

 

- 인터페이스와 상속 받아서 구현해보겠음

 

public class ThreadEx2 {

	public static void main(String[] args) {
		System.out.println("메인 시작");
		
		Thread t1 = new Thread(new Runnable() {
			
			@Override
			public void run() {
				for(int i=1; i<=9;i++) {
					System.out.println("2*"+i+" = " +(2*i));
				}
			}
		});
		
		Thread t2 = new Thread(new Runnable() {
			
			@Override
			public void run() {
				for(int i=1; i<=9; i++) {
					System.out.println("3*"+i+" = " +(3*i));
				}
				
			}
		});	
        
        Dan4Thread t3 = new Dan4Thread();
		
        t1.start();		
        t2.start();
        t3.start();
        
	System.out.println("메인 종료");	

	}
}

class Dan4Thread extends Thread {
	
	@Override
	public void run() {
		for(int i=1; i<=9; i++)
			System.out.println("4*"+i+" = " +(4*i));	
		
	}
}

 

 

- 실행될때마다 순서가 랜덤인걸 알 수 있음

상속받아 4단 출력

 

- 메인 메서드가 먼저 종료가 되고 스레드들이 제각각 실행됨 

 

- t2를 람다로 바꿔 표현한다면 ?

 

Thread t2 = new Thread(()->{
	for(int i=1; i<=9; i++) {
		System.out.println("3*"+i+" = " +(3*i));
	}
				
});
		
t2.start();

 

※ 스레드명.start() 와 스레드명.run() 차이

 

- .start(); 는 랜덤 순서로 결과 보여줌 → 스레드로서 실행

- .run(); 은 코드 순서로 결과 보여줌 → 메소드로서 실행

 

.start();
.run();

 

③ 스레드 이름

 

- setName() 메소드로 스레드 이름 변경가능

thread.setName("스레드 이름");

- getName() 메소드로 스레드 이름 확인가능

thread.getName();

- 스레드 이름 지정하지 않으면 자동적으로 'Thread-n' 으로 지정

 

 

 

 

④ 구구단 게임 !

 

- 구구단을 외자 ! 구구단을 외자 !

- 카운트다운이 스레드로 작성되지 않았으면 10초 다 세고 게임 시작함

- 카운트다운이 스레드로 작성하면 10초 세기랑 게임창 동시에 뜸

 

public class GameEx1 {

	public static void main(String[] args) {
		
		Thread t1 = new Thread(new Runnable() {
			@Override
			public void run() {
				for(int i=10; i>0;i--) {
					try {
						Thread.sleep(1000);
					}catch (InterruptedException e) {}
					System.out.println("count down : "+i );
				}
			}
		});
		t1.start();		
		
		int num1 = (int)(Math.random()*9)+1; // 1~9
		int num2 = (int)(Math.random()*9)+1; // 1~9
		
		String msg = num1 + "*"+num2+" = ? ";
		
		
		String result = JOptionPane.showInputDialog(msg);
		System.out.println(result);
		
		if((num1*num2)==Integer.parseInt(result)) {
			System.out.println("빙고");
		}else {
			System.out.println("틀림");
		}
	}

}