Frog is cry
스레드 본문
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