관리 메뉴

Frog is cry

스레드 본문

JAVA/복습

스레드

Frog is cry 2020. 7. 29. 19:44
package 스레드.ex01;

public class Th extends Thread{
	public Th(String name) {
		super(name);
	}
	
	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			System.out.println(super.getName() + "thread. i = " + i);
			try {
				sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	public static void main(String[] args) {
		Th thread1 = new Th("first");
		Th thread2 = new Th("second");
		
		thread1.start();
		thread2.start();
		
		try {
			thread1.join();
			thread2.join();	
			//join을 걸어주면 밑에있는 로직이 다 끝나고 난 후에 출력을 해주는 것 
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		System.out.println("main 종료");	// main도 쓰레드다
		
	}
}
package 스레드.ex01;

public class Thread_Ex {
	public static void main(String[] args) {
		//Thread 클래스
		Thread1 th1 = new Thread1("★");
		Thread1 th2 = new Thread1("♥");
		
		//Runnable 인터페이스
		Thread2 t1 = new Thread2("!");
		Thread2	t2 = new Thread2("?");
		Thread thread1 = new Thread(t1);
		Thread thread2 = new Thread(t2);
		
//		th1.start();
//		th2.start();
		thread1.start();
		thread2.start();
		
		
	}
}
package 스레드.ex01;
/*
 * 멀티 쓰레드
 * 
 * Thread : 클래스 상속
 * Runnable : 인터페이스 구현에 쓰임, 뒤에 able이 붙으면 인터페이스
 * 
 * 
 * 
 */
public class Thread1 extends Thread{
	// 전역변수는 자동 초기화
	String data;
	
	public Thread1(String data) { 	// 외부에서 데이터를 초기화 할 수 있게끔 함
		this.data = data;			// 그 객체의 데이터에 받아온 데이터를 초기화함
	}
	
	//Thread 발생
	
	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			System.out.println(data);
			try {
				sleep(500);			// sleep은 Thread안에 메서드이기에 내 것처럼 사용
									// 눈으로 for문이 돌아가는것을 확인하기위해 sleep 사용
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
	
	
	
	
}
package 스레드.ex01;

public class Thread2 implements Runnable{
	private String data;
	
	public Thread2(String data) {
		this.data = data;
	}

	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			System.out.println(data);
				try {
					Thread.sleep(5);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	
}

동물원 예제

package 스레드.ex02_동물원;

public class Zoo{
	
	public static void main(String[] args) {
		Cat c = new Cat();
		Thread c_t = new Thread(c);
		c_t.start();
		
		Pig p = new Pig();
		Thread p_t = new Thread(p);
		p_t.start();
		
		// 고양이랑 돼지랑 다 운뒤 오리의 울음을 출력하기 위해 join을 걸어줌.
		try {
			c_t.join();
			p_t.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	
		Duck d = new Duck();
		Thread d_t = new Thread(d);
		d_t.start();
		

		
		
	}
	
}
package 스레드.ex02_동물원;

public class Pig implements Runnable{
	
	void sound_pig() {
		System.out.println("꿀~ 꿀");
	}
	
	
	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			sound_pig();
			try {
				Thread.sleep(500);	// 0.5초
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}
package 스레드.ex02_동물원;

public class Duck implements Runnable{

	void sound_duck() {
		System.out.println("꽥~꽥!");
	}
	
	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			sound_duck();
			try {
				Thread.sleep(50);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
}
package 스레드.ex02_동물원;

public class Cat implements Runnable{
	
	void sound_cat() {
		System.out.println("야옹~");
	}
		
	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			sound_cat();
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	

}

파리바게트 예제

package 스레드.ex03_파리바게트;

import javax.swing.JOptionPane;

public class Bakery {
	public static void main(String[] args) {
		
		BreadPlate bread = new BreadPlate();
		BreadMaker maker = new BreadMaker(bread);
		
		String main_options[] = {"빵먹기", "빵이 다 떨어졌으면 누르세요"};
		int choice = 0;
		
		maker.start();
		do {
		choice = JOptionPane.showOptionDialog(null, "barkey", "bakery",
			  JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, null, main_options, null);
		
		if(choice == 0) {
			//만드는 곳에 있는 빵을 먹어줘야 한다.
			maker.getBread().eatBread();
		}else {
			break;
		}
	  }while(true);
		
	}
}
package 스레드.ex03_파리바게트;

public class BreadMaker extends Thread {
	private BreadPlate bread = null;
	
	public BreadMaker() {}
	
	public BreadMaker(BreadPlate bread) {
		setBread(bread);
	}
	
	public BreadPlate getBread() {
		return bread;
	}
	
	public void setBread(BreadPlate bread) {
		this.bread = bread;
	
	}
	
	@Override
	public void run() {
		for (int i = 0; i < 20; i++) {
			bread.makeBread();
			try {
				sleep(500);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		System.out.println("빵이 다 떨어졌습니다.");
	}
	
	
}
package 스레드.ex03_파리바게트;

public class BreadPlate {

	private int breadCnt = 0;
	public static int cnt = 1;
	
	public synchronized void makeBread() {
		if(breadCnt > 9) {
			System.out.println("빵이 가득 찼습니다.");
			try {
			   wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}else {
		breadCnt++;
		System.out.println("빵을 1개 만들었습니다. 총 :" + breadCnt + "개");
		}
	}

	public synchronized void eatBread() {
		if(cnt == 20) {
			System.out.println("빵이 다 떨어졌습니다.");
		}else if(breadCnt < 1) {
			System.out.println("빵이 없습니다. 만들때 까지 기다려 주세요.");
		}else {
			breadCnt--;
			cnt++;
			System.out.println("빵을 1개 먹었습니다. 총 : " + breadCnt + "개");
			if(breadCnt < 10) {
				this.notify();		// 멈춘 쓰레드를 다시 실행시킴
			}
		}
	}
	
}

'JAVA > 복습' 카테고리의 다른 글

Swing  (0) 2020.07.30
시간 구하기 예제  (0) 2020.07.30
MVC모델(수정필요)  (0) 2020.07.29
컬렉션 프레임워크 (Hash)  (0) 2020.07.29
컬렉션 프레임워크(Array List)  (0) 2020.07.29
Comments