0808 화

konut ko·2023년 8월 8일
0

더존비즈온5기

목록 보기
46/46

review

  • 익명 객체
    이름이 없는 객체 - 자바스크립트의 콜백함수 쓰는것처럼 생각
    new로 객체를 생성하여 변수에 담으면 그 변수명이 객체의 이름인데
    그렇게 하지 않고 new로 생성하자마자 사용하게 되니까 이름이 없는 객체가 되는 그런 너낌

  • inner class
    장점 : outer class의 멤버필드 접근 (자원사용)이 용이하다

Thread

참고


static자원은 올라갈때 class명.static자원변수명 으로 올라감!

스레드 상태

join()

  • 사용
import javax.swing.JOptionPane;

/*
 게임
 
 문제 ....
 시간 ....
 2개의 작업 동시에(경합) >> cpu 점유할 수 있는 상태 
 
 기존의 단일 Thread 불가능 (stack 1개)
 multi Thread 를 통해서 (stack 여러개 만들어서 )
 
*/

class WordTime extends Thread {
	@Override
	public void run() {
		for(int i = 10 ; i > 0 ; i-- ) {
			
			if(Ex04_Multi_Word_Game.inputcheck) return; //함수 탈출  //Thread 종료
			try {
				  System.out.println("남은 시간 : " + i);
				  Thread.sleep(1000); //휴게실 가서 1초 쉬었다가 경함 (점유) >> runnable 상태
			} catch (Exception e) {
				System.out.println(e.getMessage());
			}
		}
	}
}

class WordInputThread extends Thread {
	@Override
	public void run() {
		String dan = "2";
		String inputdata = JOptionPane.showInputDialog(dan + "단 값을 입력하세요");
		if(inputdata != null && !inputdata.equals("")) {
			Ex04_Multi_Word_Game.inputcheck = true;
		}
		System.out.println("입력값 : " + inputdata);
	}
}


public class Ex04_Multi_Word_Game {
	
	static boolean inputcheck = false; // 유무를 판단 .....
	
	public static void main(String[] args) {
		WordTime timerThread = new WordTime();
		timerThread.start();  // stack 만들고 .... run() 올려 놓는다 ... start() end
		
		WordInputThread wordinputthread = new WordInputThread();
		wordinputthread.start();
		
		// 상태 (일시정지) >> 실행되고 있는 스레드를 휴게실로 보내기
		
		// 위성과 지구와의 거리
		// 목성(T), 토성(T), 금성(T) >> 총 거리의 합 >> main /thread 3개 종료후에 ..
		
		// main thread 는 word, time이 끝난 다음에 종료하고 싶어요
		try {
			timerThread.join(); // main 에게 내가 끝날때까지 기달려
			wordinputthread.join(); // main 에게 내가 끝날때까지 기달려
		} catch (Exception e) {
			// TODO: handle exception
		}
		
		System.out.println("MAIN END"); //항상매가 다른 Thread 끝난다음에 .. 처리 할게
		// 여기서 최종값을 확인하거나.. 처리
		
	}

}

/*
문제
main 함수 제외한 Thread 2개 생성
1. 시간(time) 제어하는 Thread
2. 단어 입력을 처리하는 Thread

main 함수 2개 실행

단 단어를 하나라도 입력해서 확인 버튼을 누르면 시간을 멈추게 하세요
hint) 공유자원 (static)
Thread : 상태정보 
*/

Synchronization

Ex07_Sync_Thread : synchronized사용 예제

Wroom클래스의 openDoor(String name) : 💩싸는 과정을 담은 매서드

class Wroom {
	void openDoor(String name) {
//   synchronized void openDoor(String name) {
      System.out.println(name + "님 화장실 입장 ^^");
      for (int i = 0; i < 11; i++) {
         System.out.println(name + " 사용 중 " + i);
         if (i == 10) {
            System.out.println(name + "님 끙~~@#$@%!%^&");
         }
      }
      System.out.println("시원하시죠 ^^");
   }
}

Thread를 상속하는 💩을 싸는 User객체. Thread의 run() 매서드를 재정의함.

class User extends Thread {
   Wroom wr;
   String who;

   User(String name, Wroom wr) { 
	// 생성자 함구 : 오버로딩으로 멤버필드 초기화 강제!!
	//처음에 스레드 객체 만들때 그냥 초기화 시켜버릴라고하는 것임
      this.who = name;
      this.wr = wr;
   }

   @Override 
   public void run() {
      wr.openDoor(this.who);// 여기서 오버라이드 왜해?
   }
}

main 함수

public class Ex07_Sync_Thread {
   public static void main(String[] args) {
      // 한강 둔치
      Wroom w = new Wroom();

      // 사람들이 놀고 있어요
      User kim = new User("김씨", w);
      User lee = new User("이씨", w);
      User park = new User("박씨", w);

      // 배가 아파요
      kim.start();
      lee.start();
      park.start();
   }
}

스레드 개념

Thread의 start() 매서드 & synchronized 미사용 시


1) 프로젝트를 실행하면 => stack에 main 함수가 올라가면서 main함수가 실행된다.
2) main함수내에 있는 코드를 순차적으로 읽으며 실행된다.
3) 위 예제 코드의 kim.start();가 실행
= 위 사진의 stack 처럼 start() 함수가 stack에 올라가 실행
얘는 Thread 객체의 재정의된 run()함수를 Thread에 올리고 start()는 종료되어 stack에서 내려간다.
4) 이 때 run()매소드가 실행되는 Thread는 stack과 별개로 작동한다.
5) 위 예제 코드의 다음 줄인 lee.start();, park.start();도 마찬가지로 위 과정을 거친다.

6) 그렇다면 위 그림과 같이 된다. stack과 kim의 Thread와 lee의 Thread와 parck의 Thread 넷이서 CPU를 차지하기 위해 경합을 벌인다(?)
김이박 세 명이서 서로 들락거리며 💩을 번갈아 누게 되는 결과를 얻는다..
[결과 화면]


synchronized 사용

그런데 여기다가 💩싸는 함수인 openDoor에 다음과 같이 synchronized를 붙이면

김이박 세 명이서 같이 차례로 💩을 눌 수 있게 된다.
[결과창]

CPU 점유율 부여 : setPriority(), getPriority()

profile
보초딩코라 틀린 내용 있을 수도 있습니다. 댓글 지적 환영

1개의 댓글

comment-user-thumbnail
2023년 8월 8일

좋은 정보 얻어갑니다, 감사합니다.

답글 달기