익명 객체
이름이 없는 객체 - 자바스크립트의 콜백함수 쓰는것처럼 생각
new로 객체를 생성하여 변수에 담으면 그 변수명이 객체의 이름인데
그렇게 하지 않고 new로 생성하자마자 사용하게 되니까 이름이 없는 객체가 되는 그런 너낌
inner class
장점 : outer class의 멤버필드 접근 (자원사용)이 용이하다
static자원은 올라갈때 class명.static자원변수명 으로 올라감!
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 : 상태정보
*/
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("시원하시죠 ^^");
}
}
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);// 여기서 오버라이드 왜해?
}
}
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를 붙이면
김이박 세 명이서 같이 차례로 💩을 눌 수 있게 된다.
[결과창]
좋은 정보 얻어갑니다, 감사합니다.