PowerPoint 프레젠테이션

Similar documents
(Microsoft PowerPoint - java2-lecture6.ppt [\310\243\310\257 \270\360\265\345])

Microsoft PowerPoint - java2-lecture6.ppt [호환 모드]

제11장 프로세스와 쓰레드

쉽게 풀어쓴 C 프로그래밍

PowerPoint Presentation

10장.key

Microsoft PowerPoint - 04-UDP Programming.ppt

JAVA PROGRAMMING 실습 08.다형성

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

PowerPoint Presentation

Microsoft PowerPoint - 14주차 강의자료

Microsoft PowerPoint - Java7.pptx

public class FlowLayoutPractice extends JFrame { public FlowLayoutPractice() { super("flowlayout Practice"); this. Container contentpane = getcontentp

PowerPoint 프레젠테이션

스레드의우선순위 우선순위설정메소드 : void setpriority(int newpriority) newpriority 에설정할수있는등급 : 1( 가장낮은우선순위 ) 부터 10( 가장높은우선순위 ) 가장높은우선순위 : MAX_PRIORITY, 보통우선순위 : NORM_

PowerPoint Presentation

PowerPoint Presentation

<4D F736F F F696E74202D20C1A63139C0E520B9E8C4A120B0FCB8AEC0DA28B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

PowerPoint Presentation

gnu-lee-oop-kor-lec10-1-chap10

Microsoft PowerPoint - lec12 [호환 모드]

gnu-lee-oop-kor-lec06-3-chap7

9장.key

스레드를적용하지않은결과와스레드를적용한결과의비교 1) 두개의작업을스레드를사용하지않고수행한예 ) : 순차작업 class ThreadTest2 { System.out.print("-");// 화면에 - 를출력하는작업 System.out.print(" ");// 화면에 를출력

PowerPoint Presentation

11장.key

PowerPoint Presentation

<4D F736F F F696E74202D20C1A63233C0E520B1D7B7A1C7C820C7C1B7CEB1D7B7A1B9D628B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

05-class.key

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

No Slide Title

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

PowerPoint 프레젠테이션

슬라이드 1

<4D F736F F F696E74202D20C1A63138C0E520C0CCBAA5C6AE20C3B3B8AE28B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

PowerPoint 프레젠테이션

(Microsoft PowerPoint - java1-lecture11.ppt [\310\243\310\257 \270\360\265\345])

Chap12

02 C h a p t e r Java

PowerPoint Presentation

Cluster management software

JAVA PROGRAMMING 실습 09. 예외처리

PowerPoint Presentation

Network Programming

<4D F736F F F696E74202D20C1A63236C0E520BED6C7C3B8B428B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

Design Issues

오버라이딩 (Overriding)

Microsoft PowerPoint - Supplement-03-TCP Programming.ppt [호환 모드]

JAVA PROGRAMMING 실습 05. 객체의 활용

<4D F736F F F696E74202D20C1A63230C0E520BDBAC0AE20C4C4C6F7B3CDC6AE203128B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

C++ Programming

Microsoft PowerPoint - RMI.ppt

Microsoft PowerPoint - CSharp-10-예외처리

Microsoft PowerPoint - 03-TCP Programming.ppt

PowerPoint 프레젠테이션

. 스레드 (Thread) 란? 스레드를설명하기전에이글에서언급되는용어들에대하여알아보도록하겠습니다. - 응용프로그램 ( Application ) 사용자에게특정서비스를제공할목적으로구현된응용프로그램을말합니다. - 컴포넌트 ( component ) 어플리케이션을구성하는기능별요

Microsoft PowerPoint - 2강

자바GUI실전프로그래밍2_장대원.PDF

PowerPoint 프레젠테이션

Java Programing Environment

비긴쿡-자바 00앞부속

슬라이드 1

Microsoft PowerPoint - ÀÚ¹Ù08Àå-1.ppt

Spring Boot

Cluster management software

제8장 자바 GUI 프로그래밍 II

Microsoft PowerPoint - 06-Chapter09-Event.ppt

Microsoft Word - java18-1-final-answer.doc

PowerPoint Presentation

쉽게 풀어쓴 C 프로그래밊

Microsoft PowerPoint os5.ppt

PowerPoint 프레젠테이션

JAVA PROGRAMMING 실습 02. 표준 입출력

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

PowerPoint Presentation

강의자료

PowerPoint 프레젠테이션

자바로

10.0pt1height.7depth.3width±â10.0pt1height.7depth.3widthÃÊ10.0pt1height.7depth.3widthÅë10.0pt1height.7depth.3width°è10.0pt1height.7depth.3widthÇÁ10.0pt1height.7depth.3width·Î10.0pt1height.7depth.3width±×10.0pt1height.7depth.3width·¡10.0pt1height.7depth.3width¹Ö pt1height.7depth.3widthŬ10.0pt1height.7depth.3width·¡10.0pt1height.7depth.3width½º, 10.0pt1height.7depth.3width°´10.0pt1height.7depth.3widthü, 10.0pt1height.7depth.3widthº¯10.0pt1height.7depth.3width¼ö, 10.0pt1height.7depth.3width¸Þ10.0pt1height.7depth.3width¼Ò10.0pt1height.7depth.3widthµå

rmi_박준용_final.PDF

예제 2) Test.java class A intvar= 10; void method() class B extends A intvar= 20; 1"); void method() 2"); void method1() public class Test 3"); args) A

PowerPoint 프레젠테이션

JTable과 MVC(Model-View-Controller) 구조 - 모델-뷰-컨트롤러구조는데이터의저장과접근에대한제공은모델이담당하고, 화면표시는뷰, 이벤트의처리는컨트롤러가하도록각역할을구분한구조이다. 즉, 역할의분담을통하여상호간의영향을최소화하고각요소의독립성을보장하여독자

PowerPoint Presentation

PowerPoint Presentation

PowerPoint Presentation

슬라이드 1

PowerPoint 프레젠테이션

Spring Boot/JDBC JdbcTemplate/CRUD 예제

class Sale void makelineitem(productspecification* spec, int qty) SalesLineItem* sl = new SalesLineItem(spec, qty); ; 2. 아래의액티비티다이어그램을보고 Java 또는 C ++,

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

자바 쓰레드 능숙하게 다루기

PowerPoint 프레젠테이션

파일로입출력하기II - 파일출력클래스중에는데이터를일정한형태로출력하는기능을가지고있다. - PrintWriter와 PrintStream을사용해서원하는형태로출력할수있다. - PrintStream은구버전으로가능하면 PrintWriter 클래스를사용한다. PrintWriter

쉽게 풀어쓴 C 프로그래밍

8장.그래픽 프로그래밍

예외 예외정의예외발생예외처리예외전파 단정 단정의선언 단정조건검사옵션 2

Transcription:

명품 JAVA Essential 1

2 학습목표 1. 멀티태스킹과스레드의개념이해 2. Thread 클래스를상속받아자바스레드만들기 3. Runnable 인터페이스를구현하여자바스레드만들기 4. 스레드종료시키기 5. 스레드의동기화개념과필요성이해 6. synchronized로간단한스레드동기화 7. wait()-notify() 로간단한스레드동기화

멀티태스킹 (multi-tasking) 개념 3 멀티태스킹 여러개의작업 ( 태스크 ) 이동시에처리되는것

4 멀티태스킹프로그램사례

스레드와운영체제 5 스레드 (thread) 운영체제에의해관리되는하나의작업혹은태스크스레드와태스크 ( 혹은작업 ) 은바꾸어사용해도무관 멀티스레딩 (multi-threading) 여러스레드를동시에실행시키는응용프로그램을작성하는기법 스레드구성 스레드코드 작업을실행하기위해작성한프로그램코드 개발자가작성 스레드정보 스레드명, 스레드 ID, 스레드의실행소요시간, 스레드의우선순위등 운영체제가스레드에대해관리하는정보

멀티태스킹과멀티스레딩 6 멀티태스킹구현기술 멀티프로세싱 (multi-processing) 하나의응용프로그램이여러개의프로세스를생성하고, 각프로세스가하나의작업을처리하는기법 각프로세스독립된메모리영역을보유하고실행 프로세스사이의문맥교환에따른과도한오버헤드와시간소모의문제점 멀티스레딩 (multi-threading) 하나의응용프로그램이여러개의스레드를생성하고, 각스레드가하나의작업을처리하는기법 하나의응용프로그램에속한스레드는변수메모리, 파일오픈테이블등자원으로공유하므로, 문맥교환에따른오버헤드가매주작음 현재대부분의운영체제가멀티스레딩을기본으로하고있음

웹서버의멀티스레딩사례 7 웹서비스스레드 각클라이언트당웹서비스스레드생성웹서비스스레드 웹문서요청웹문서전송웹문서요청웹문서전송 웹클라이언트 웹클라이언트 웹서버 웹서비스스레드 웹문서전송 웹문서요청 웹클라이언트 웹서비스스레드 웹문서전송 웹문서요청 웹클라이언트 웹서버시스템

자바스레드 (Thread) 와 JVM 8 자바스레드 자바가상기계 (JVM) 에의해스케쥴되는실행단위의코드블럭스레드의생명주기는 JVM에의해관리됨 : JVM은스레드단위로스케쥴링 JVM 과자바의멀티스레딩 하나의 JVM은하나의자바응용프로그램만실행 자바응용프로그램이시작될때 JVM이함께실행됨 자바응용프로그램이종료하면 JVM도함께종료함응용프로그램은하나이상의스레드로구성가능

자바스레드만들기 9 스레드만드는 2 가지방법 java.lang.thread 클래스를상속받아스레드작성 java.lang.runnable 인터페이스를구현하여스레드작성

Thread 클래스를상속받아스레드만들기 (1) 10 Thread 클래스의주요메소드

Thread 클래스를상속받아스레드만들기 (2) 11 Thread를상속받아 run() 오버라이딩 Thread 클래스상속. 새클래스작성 run() 메소드작성 run() 메소드를스레드코드라고부름 run() 메소드에서스레드실행시작 class TimerThread extends Thread {... public void run() { // run() 오버라이딩... 스레드객체생성 생성된객체는필드와메소드를가진객체일뿐스레드로작동하지않음 TimerThread th = new TimerThread(); 스레드시작 start() 메소드호출 스레드로작동시작 스레드객체의 run() 이비로소실행 JVM 에의해스케쥴되기시작함 th.start();

12 Thread 를상속받아 1 초단위로초시간을출력하는 TimerThread 스레드작성사례 스레드클래스선언 스레드코드작성 1 초에한번씩 n 을증가시켜콘솔에출력한다. 스레드객체생성 스레드시작 class TimerThread extends Thread { int n = 0; public void run() { while(true) { // 무한루프를실행한다. System.out.println(n); n++; try { sleep(1000); //1 초동안잠을잔후깨어난다. catch(interruptedexception e){return; public class TestThread { public static void main(string [] args) { TimerThread th = new TimerThread(); th.start(); 0 1 2 3 4...

예제 12-1 : Thread 를상속받아 1 초단위타이머스레드만들기 13 import java.awt.*; import javax.swing.*; class TimerThread extends Thread { JLabel timerlabel; // 타이머값이출력되는레이블 public TimerThread(JLabel timerlabel) { this.timerlabel = timerlabel; // 스레드코드. run() 이종료하면스레드종료 public void run() { int n=0; // 타이머카운트값 while(true) { // 무한루프 timerlabel.settext(integer.tostring(n)); n++; // 카운트증가 try { Thread.sleep(1000); // 1 초동안잠을잔다. catch(interruptedexception e) { return; public class ThreadTimerEx extends JFrame { public ThreadTimerEx() { settitle("thread 를상속받은타이머스레드예제 "); setdefaultcloseoperation(jframe.exit_on_close); Container c = getcontentpane(); c.setlayout(new FlowLayout()); // 타이머값을출력할레이블생성 JLabel timerlabel = new JLabel(); timerlabel.setfont(new Font("Gothic", Font.ITALIC, 80)); c.add(timerlabel); TimerThread th = new TimerThread(timerLabel); setsize(250,150); setvisible(true); th.start(); // 타이머스레드의실행을시작하게한다. public static void main(string[] args) { new ThreadTimerEx();

Runnable 인터페이스로스레드만들기 14 Runnable 인터페이스구현하는새클래스작성 run() 메소드구현 run() 메소드를스레드코드라고부름 run() 메소드에서스레드실행시작 class TimerRunnable implements Runnable {... public void run() { // run() 메소드구현... 스레드객체생성 Thread th = new Thread(new TimerRunnable()); 스레드시작 start() 메소드호출 스레드로작동시작 스레드객체의 run() 이비로소실행 JVM에의해스케쥴되기시작함 th.start();

15 예제 12-2 : Runnable 인터페이스를이용하여 1 초단위로출력하는타이머스레드만들기 import java.awt.*; import javax.swing.*; class TimerRunnable implements Runnable { JLabel timerlabel; public TimerRunnable(JLabel timerlabel) { this.timerlabel = timerlabel; // 스레드코드. run() 이종료하면스레드종료 public void run() { int n=0; // 타이머카운트값 while(true) { // 무한루프 timerlabel.settext(integer.tostring(n)); n++; try { Thread.sleep(1000); // 1 초동안잠을잔다. catch(interruptedexception e) { return; public class RunnableTimerEx extends JFrame { public RunnableTimerEx() { settitle("runnable 을구현한타이머스레드예제 "); setdefaultcloseoperation(jframe.exit_on_close); Container c = getcontentpane(); c.setlayout(new FlowLayout()); // 타이머값을출력할레이블생성 JLabel timerlabel = new JLabel(); timerlabel.setfont(new Font("Gothic", Font.ITALIC, 80)); c.add(timerlabel); // 레이블을컨텐트팬에부착 TimerRunnable runnable = new TimerRunnable(timerLabel); Thread th = new Thread(runnable); // 스레드객체생성 setsize(250,150); setvisible(true); th.start(); // 타이머스레드가실행을시작하게한다. public static void main(string[] args) { new RunnableTimerEx();

main 스레드 16 main 스레드 JVM 이응용프로그램을실행할때디폴트로생성되는스레드 main() 메소드실행시작 main() 메소드가종료하면 main 스레드종료

예제 12-3 : main 스레드확인과스레드정보를알아내는코드 17 main() 메소드내에서현재스레드정보를가진 Thread 객체를알아내어현재실행중인스레드에관한다양한정보를출력한다. public class ThreadMainEx { public static void main(string [] args) { long id = Thread.currentThread().getId(); String name = Thread.currentThread().getName(); int priority = Thread.currentThread().getPriority(); Thread.State s = Thread.currentThread().getState(); System.out.println(" 현재스레드이름 = " + name); System.out.println(" 현재스레드 ID = " + id); System.out.println(" 현재스레드우선순위값 = " + priority); System.out.println(" 현재스레드상태 = " + s); 현재스레드이름 = main 현재스레드 ID = 1 현재스레드우선순위값 = 5 현재스레드상태 = RUNNABLE

스레드종료와타스레드강제종료 18 스스로종료 run() 메소드리턴 타스레드에서강제종료 interrupt() 메소드사용 public static void main(string [] args) { TimerThread th = new TimerThread(); th.start(); th.interrupt(); // TimerThread 강제종료 class TimerThread extends Thread { int n = 0; public void run() { while(true) { System.out.println(n); // 화면에카운트값출력 n++; try { sleep(1000); catch(interruptedexception e){ return; // 예외를받고스스로리턴하여종료 return 하지않으면스레드는종료하지않음 main() 스레드 TimerThread 스레드 th th.interrupt(); InterruptedException 발생 catch(interruptedexception e) {return; main 스레드의 interrupt() 메소드호출에의해 catch 문실행. 그리고종료

19 예제 12-4 : 진동하는스레드와스레드의강제종료 Runnable 을받은스레드를작성하여프레임이심하게진동하도록프로그램을작성하라. 그리고컨텐트팬에마우스를클릭하면진동스레드를종료시켜진동이멈추도록하라

예제 12-4 정답 20 import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.random; Runnable 인터페이스구현. 프레임에 run() 메소드반드시작성필요 public class VibratingFrame extends JFrame implements Runnable { Thread th; // 진동하는스레드 public VibratingFrame() { settitle(" 진동하는프레임만들기 "); setdefaultcloseoperation(jframe.exit_on_close); setsize(200,200); setlocation(300,300); setvisible(true); getcontentpane().addmouselistener(new MouseAdapter() { public void mousepressed(mouseevent e) { if(!th.isalive()) return; th.interrupt(); ); public void run() { // 프레임의진동을일으키기위해 // 20ms마다프레임의위치를랜덤하게이동 Random r = new Random(); while(true) { try { Thread.sleep(20); // 20ms 잠자기 catch(interruptedexception e){ return; // 리턴하면스레드종료 int x = getx() + r.nextint()%5; // 새위치 x int y = gety() + r.nextint()%5; // 새위치 y setlocation(x, y); // 프레임의위치이동 public static void main(string [] args) { new VibratingFrame(); th = new Thread(this); // 진동하는스레드객체생성 th.start(); // 진동시작 프레임객체가 Runnable 인터페이스를구현한객체이므로 this 가능

스레드동기화 (Thread Synchronization) 21 멀티스레드프로그램작성시주의점 다수의스레드가공유데이터에동시에접근하는경우 공유데이터의값에예상치못한결과발생가능 스레드동기화 동기화란? 스레드사이의실행순서제어, 공유데이터에대한접근을원활하게하는기법 멀티스레드의공유데이터의동시접근문제해결 방법 1) 공유데이터를접근하는모든스레드의한줄세우기 방법 2) 한스레드가공유데이터에대한작업을끝낼때까지다른스레드가대기하도록함 자바의스레드동기화방법 - 2 가지 synchronized 키워드로동기화블록지정 wait()-notify() 메소드로스레드의실행순서제어

22 동기화의필요성 - 두스레드가프린터에동시쓰기로충돌하는경우 스레드 B 스레드 A 스레드 B 자바는좋은것이야. 배워서많이알고취직도잘되고. 스레드 A 가프린터사용을끝낼때까지기다린다. I love you forever. 자바는좋은것이야. 배워서많이알고취직도잘되고. 스레드 A I love you forever. I love 자바는좋은것이야. you 배워서많이 forever. 알고취직도잘되고. I love you forever. 두스레드가동시에프린터에쓰는경우문제발생 한스레드의출력이끝날때까지다른스레드대기함으로써정상출력

synchronized 블록지정 23 synchronized 키워드 스레드가독점적으로실행해야하는부분 ( 동기화코드 ) 을표시하는키워드 임계영역 (criitical section) 표기키워드 synchronized 블록지정방법 메소드전체혹은코드블록 synchronized 블록이실행될때, 먼저실행한스레드가모니터소유 모니터란해당객체를독점적으로사용할수있는권한 모니터를소유한스레드가모니터를내놓을때까지다른스레드대기 synchronized void print(string text) { // 동기화메소드... for(int i=0; i<text.length(); i++) // text 의각문자출력 System.out.print(text.charAt(i));... synchronized 메소드 void execute(string text) {... synchronized(this) { // 동기화코드블록... for(int i=0; i<text.length(); i++) System.out.print(text.charAt(i));... synchronized 코드블록

24 예제 12-5 : 두스레드가공유프린터객체를통해동시에출력하는경우동기화 - synchronized 블록지정 public class SynchronizedEx { public static void main(string[] args) { SharedPrinter p = new SharedPrinter(); // 공유데이터생성 String [] engtext = { "Wise men say, ", "only fools rush in", "But I can't help, ", "falling in love with you", "Shall I stay? ", "Would it be a sin?", "If I can't help, ", "falling in love with you" ; String [] kortext = { " 동해물과백두산이마르고닳도록, ", " 하느님이보우하사우리나라만세 ", " 무궁화삼천리화려강산, ", " 대한사람대한으로길이보전하세 ", " 남산위에저소나무, 철갑을두른듯 ", " 바람서리불변함은우리기상일세.", " 무궁화삼천리화려강산, ", " 대한사람대한으로길이보전하세 " ; Thread th1 = new WorkerThread(p, engtext);// 영문출력스레드 Thread th2 = new WorkerThread(p, kortext);// 국문출력스레드 // 두스레드를실행시킨다. th1.start(); th2.start(); // 두 WorkerThread 스레드에의해동시접근되는공유프린터 class SharedPrinter { // synchronized 를생략하면 // 한글과영어가한줄에섞여출력되는경우가발생한다. synchronized void print(string text) { // Thread.yield(); for(int i=0; i<text.length(); i++) System.out.print(text.charAt(i)); System.out.println(); // 스레드클래스 class WorkerThread extends Thread { SharedPrinter p; // 공유프린터주소 String [] text; WorkerThread(SharedPrinter p, String[] text) { this.p = p; this.text = text; // 스레드는반복적으로공유프린터에 10 번접근 text[] 출력 public void run() { for (int i=0; i<text.length; i++) // 한줄씩출력 p.print(text[i]); // 공유프린터에출력

예제 12-5 실행결과 25 한글이한줄출력되든지영문이한줄출력되는것이정상이지만 synchronized 가생략된 print() 메소드가두스레드에의해동시호출되면두스레드의동기화가이루어지지않아서한글과영문이섞여출력된다. Wise men say, only fools rush in But I can't help, falling in love with you Shall I stay? Would it be a sin? If I can't help, falling in love with you 동해물과백두산이마르고닳도록, 하느님이보우하사우리나라만세무궁화삼천리화려강산, 대한사람대한으로길이보전하세남산위에저소나무, 철갑을두른듯바람서리불변함은우리기상일세. 무궁화삼천리화려강산, 대한사람대한으로길이보전하세 라인 31 에 synchronized 로선언한경우 Wise 동해물과백두산이마르고닳도록, men say, only fools rush in print() 메소드충돌 But I can't help, 하느님이보우하사우리나라만세 falling in love with you 무궁화삼천리 Shall I stay? print() 메소드충돌화려강산, Would it be a sin? 대한사람대한으로길이보전하세 If I can't help, 남산위에저소나무, 철갑을두른듯 falling in love바람서리불변함은우리기상일세. with you print() 메소드충돌무궁화삼천리화려강산, 대한사람대한으로길이보전하세 라인 31 에 synchronized 를생략한경우

wait()-notify() 를이용한스레드동기화 26 wait()-notify() 가필요한경우 공유데이터로두개이상의스레드가데이터를주고받을때 producer-consumer 문제 동기화메소드 wait() : 다른스레드가 notify() 를불러줄때까지기다린다. notify() : wait() 를호출하여대기중인스레드를깨운다. wait(), notify() 는 Object 의메소드

예제 12-6 : wait(), notify() 를이용한바채우기 27 다음설명과같이작동하는스윙프로그램을작성하라. 아래그림에는스레드를가진 bar 가있다. 아무키나누르면 bar 에마젠타색이오른쪽으로 1/100 씩채워진다. 가만히있으면스레드에의해 0.1 초간격으로 bar 의마젠타색을 1/100 씩감소시킨다. 키를빨리누르지않으면스레드의감소속도를이기지못한다. bar 는 JLabel 을상속받은 MyLabel 로작성하고 MyLabel 의 paintcomponent() 메소드가 bar 를마젠타색으로채우도록하라. 초기화면 키를반복하여빨리누른화면

예제 12-6 정답 28 import javax.swing.*; import java.awt.*; import java.awt.event.*; class MyLabel extends JLabel { int barsize = 0; // 바의크기 int maxbarsize; MyLabel(int maxbarsize) { this.maxbarsize = maxbarsize; public void paintcomponent(graphics g) { super.paintcomponent(g); g.setcolor(color.magenta); int width = (int)(((double)(this.getwidth())) /maxbarsize*barsize); if(width==0) return; g.fillrect(0, 0, width, this.getheight()); synchronized void fill() { if(barsize == maxbarsize) { try { wait(); catch (InterruptedException e) { return; barsize++; repaint(); // 바다시그리기 notify(); synchronized void consume() { if(barsize == 0) { try { wait(); catch (InterruptedException e) { return; barsize--; repaint(); // 바다시그리기 notify(); class ConsumerThread extends Thread { MyLabel bar; ConsumerThread(MyLabel bar) { this.bar = bar; public void run() { while(true) { try { sleep(200); bar.consume(); catch (InterruptedException e) { return; public class TabAndThreadEx extends JFrame { MyLabel bar = new MyLabel(100); TabAndThreadEx(String title) { super(title); this.setdefaultcloseoperation (JFrame.EXIT_ON_CLOSE); Container c = getcontentpane(); c.setlayout(null); bar.setbackground(color.orange); bar.setopaque(true); bar.setlocation(20, 50); bar.setsize(300, 20); c.add(bar); c.addkeylistener(new KeyAdapter() { public void keypressed(keyevent e) { bar.fill(); ); setsize(350,200); setvisible(true); c.requestfocus(); ConsumerThread th = new ConsumerThread(bar); th.start(); // 스레드시작 public static void main(string[] args) { new TabAndThreadEx( " 아무키나빨리눌러바채우기 ");