150923 쓰레드 윈도우 프로그래밍
****Thread - 한 작업
1) processs program 파일이 저장만 되어있으면 프로그램, 실행이 되면 프로세스
2) 단일 프로세스 멀티프로세스
3) 하나의 프로세스 에서 실횅하는 작업 단위
4) 멀티쓰레드 -
5) 모든프로그램은 반드시 하나이상의 쓰레드를 포함
-main():메인쓰레드
6) 스레드 구현방식
1. runnable
2. Thread 클래스
7) LifeCycle
8) 동기화 (Synchronize)
1) 세마포어 ,뮤텍스
2) synchronized
- 메서드 에서만 사용
- block 사용
synchronized (객체주소){
코드...
}
9) 스레드의 종료
1) 우선순위 (메인스레드가 가장 나중에 종료할 수 있도록 유도 )
- isAlive()
- join()
2) 종료방법 ( 강제 종료를 해야 할 경우 )
- stop() // 전선 뽑는 급의 종료, 왠만하면 쓰지말아야할 메소드
- inturrupt() // stop 보다는 부드러운 종료
- 직접종료 // 직접 내손으로처리함
**********************************************************************************************************************************************************
windows programming
윈도우 프로그래밍
1. AWT (Abstract Window Toolkit ) -> Swing
2. 3요소
1) 재료 : component
- java.awt 패키지
- Button, Canvas, Checkbox, Choice, Container, Label, List,
-container
panel
Applet
winldows
Dialog
Frame (크기 를 정하고 보여줄 수 있게 설정 )
dialog common dialog(내장 다이얼로그, 시스템 다이얼로그)
user Definedialog ( dialog를 상속 )
Modal 과Modaless
2) 디자인 (배치) : LayOut
- 재료(component)를 원하는 위치에 배치
-레이아웃 매니저
FlowLayout
: 순서대로
: 패널
BorderLayout
: 테두리를 기준으로 배치 (동, 서, 남, 북, 중)
: window 의 기본 레이아웃
GridLayout
: 테이블 모양으로 배치
GridBagLayout
: 불규칙 테이블 모양으로 배치
CardLayout
: 보더레이아웃 처럼 배치를 해놓고 화면전환용 으로 이용가능
3) 동작 : Event
3. 분야
1)어플리케이션
2) 애플릿
============================================================================FlagTest
============================================================================
class StopThreadDemo2 extends Thread {
private boolean m_stopped = false;
@Override
public void run() {
try {
while (!m_stopped)
{
System.out.println("쓰레드 라이브");
sleep(500);
}
} catch (InterruptedException err) {
err.printStackTrace();
} finally {
System.out.println("쓰레드사망");
}
}
public void setStop() {
m_stopped = true;
}
}
public class FlagTest {
public static void main(String[] args) throws InterruptedException {
// TODO 인터럽트 스탑 예제
System.out.println("********* Flag 를 이용한 종료 *********");
StopThreadDemo2 demo = new StopThreadDemo2();
demo.start();
Thread.sleep(5000);
demo.setStop();
}
}
============================================================================InterruptTest
============================================================================
class StopThreadDemo1 extends Thread {
@Override
public void run() {
try {
//while (true)
while(!Thread.currentThread().isInterrupted()) // 인터럽트 명령이 들어오면 끝내라
{
System.out.println("쓰레드 라이브");
sleep(500);
}
} catch (InterruptedException err) {
err.printStackTrace();
} finally {
System.out.println("쓰레드사망");
}
}
}
public class InterruptTest {
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
System.out.println("******** 인터럽트 를 이용한 종료 *********");
StopThreadDemo1 demo = new StopThreadDemo1();
demo.start();
Thread.sleep(5000);
demo.interrupt();
}
}
============================================================================
SynchronizeTest
============================================================================
class Toilet{
public synchronized void openDoor( String name, String key){ // synchromized - 동기화
System.out.println(name + "입장");
for (int i=0 ; i < 100000 ; i++){
if ( i ==5000)
System.out.println(name + "뿌우우우우우욱?!");
}
System.out.println(name + " : ㅇㅏ 시원해");
}
}
class Family extends Thread{ //가족별로 쓰레드 생성
Toilet toilet;
String who;
String key;
Family ( Toilet t, String w){
toilet = t;
who = w;
}
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
toilet.openDoor(who, key);
}
}
public class SynchronizeTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Toilet toilet = new Toilet();
Family father = new Family(toilet,"아빠");
Family mother = new Family(toilet,"엄마");
Family brother = new Family(toilet,"형");
Family sister = new Family(toilet,"누나");
Family me = new Family(toilet,"나");
father.start();
mother.start();
brother.start();
sister.start();
me.start();
}
}
============================================================================
ThreadFinishOrder
============================================================================
class ThreadDemo6 extends Thread{
ThreadDemo6(String name){
super(name);
start();
}
@Override
public void run() {
System.out.println(getName() + " 자식 스레드 시작");
int cnt = 0;
do{
try {
sleep(500);
}
catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(getName() + " count : " + cnt);
cnt++;
}while(cnt < 10);
System.out.println(getName() + " 자식 스레드 종료");
}
}
public class ThreadFinishOrder {
public static void main(String[] args) throws InterruptedException {
// TODO 스레드 예제3
System.out.println("메인 스레드 시작");
ThreadDemo6 t1 = new ThreadDemo6("first");
ThreadDemo6 t2 = new ThreadDemo6("second");
int cnt = 0;
do{
try {
Thread.sleep(200);
}
catch (InterruptedException e) {
e.printStackTrace();
}
System.out.print(".");
cnt++;
}
while(cnt < 10);
t1.join();
t2.join();
//while (t1.isAlive() || t2.isAlive() ); // isAlive 를 이용해서 자식스레드가 끝날때 까지 메인이 끝나지 않음
System.out.println("메인 스레드 종료");
}
}
============================================================================
CheckBoxTest
============================================================================
package component;
import java.awt.Checkbox;
import java.awt.CheckboxGroup;
import java.awt.FlowLayout;
import java.awt.Frame;
public class CheckBoxTest extends Frame {
Checkbox c1,c2,c3;
Checkbox r1,r2;
CheckboxGroup g;
public CheckBoxTest(){
c1 = new Checkbox("등산", true);
c2 = new Checkbox("낚시");
c3 = new Checkbox("여행");
setLayout(new FlowLayout());
add(c1);
add(c2);
add(c3);
g = new CheckboxGroup();
r1 = new Checkbox("남자",false,g);
r2 = new Checkbox("여자",false,g);
add(r1);
add(r2);
}
public static void main(String[] args) {
// TODO checkBox 컴퍼넌트 예제
CheckBoxTest test = new CheckBoxTest();
test.setSize(300,400);
test.setVisible(true);
}
}
============================================================================ChoiceTest
============================================================================
package component;
import java.awt.Choice;
import java.awt.Frame;
public class ChoiceTest extends Frame{
Choice c;
ChoiceTest(){
c = new Choice();
c.addItem("홍길동");
c.addItem("임꺽정");
c.addItem("신돌석");
add(c);
}
public static void main(String[] args) {
// TODO Choice컴퍼넌트 예제
ChoiceTest test = new ChoiceTest();
test.setSize(300,400);
test.setVisible(true);
}
}
============================================================================
LableTest
============================================================================
package component;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
//
//public class LableTest {
//
//Label lab1, lab2, lab3;
//Frame f;
//
//LableTest(){
// lab1 = new Label("첫번째 라벨");
// lab2 = new Label("두번째 라벨");
// lab3 = new Label("세번째 라벨");
//
// f = new Frame ( "라벨 연습 프로그램 ");
// f.setLayout(new FlowLayout());
// f.add(lab1);
// f.add(lab2);
// f.add(lab3);
//
// lab1.setBackground(Color.magenta);
// lab2.setBackground(Color.lightGray);
// lab3.setBackground(Color.red);
//
// f.setSize(300,400);
// f.setVisible(true);
//
//}
// public static void main(String[] args) {
// // TODO lavel1 컴폰퍼트 클래스
//
// new LableTest();
// }
//
//}
public class LableTest extends Frame {
Label lab1, lab2, lab3;
LableTest(){
super ("레이블연습");
lab1 = new Label("첫번째 라벨");
lab2 = new Label("두번째 라벨");
lab3 = new Label("세번째 라벨");
setLayout(new FlowLayout());
add(lab1);
add(lab2);
add(lab3);
lab1.setBackground(Color.magenta);
lab2.setBackground(Color.lightGray);
lab3.setBackground(Color.red);
}
public static void main(String[] args) {
// TODO lavel1 컴폰퍼트 클래스
LableTest labTest = new LableTest();
//lableTest.setSize(300,400);
labTest.setBounds(10,10,300,400);
labTest.setVisible(true);
}
}
============================================================================ ListTest
============================================================================
package component;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.List;
public class ListTest extends Frame{
List list1, list2;
ListTest(){
setLayout(new FlowLayout());
list1 = new List(3,true);//true: 다중선택
list2 = new List(3,false);//false: 단일선택
list1.add("사과");
list1.add("배");
list1.add("포도");
list1.add("감");
list1.add("수박");
list2.add("짜장면");
list2.add("짬뽕");
list2.add("군만두");
list2.add("난자완스");
list2.add("샥스핀");
add(list1);
add(list2);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
ListTest test = new ListTest();
test.setSize(300,400);
test.setVisible(true);
}
}
============================================================================ TextTest
============================================================================
package component;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
public class TextTest extends Frame {
TextArea ta;
TextField tf;
TextTest(){
setLayout(new FlowLayout());
ta = new TextArea("이것은 TextArea이다", 3, 30);
tf = new TextField("이것은 TextField이다", 30);
add(ta);
add(tf);
}
//***********************************************
public static void main(String[] args) {
// TODO TextComponent예제
TextTest test = new TextTest();
test.setSize(300,400);
test.setVisible(true);
}
}
============================================================================
CommonDialog(
============================================================================
package container;
import java.awt.Button;
import java.awt.FileDialog;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class CommonDialog extends Frame implements ActionListener{
FileDialog fopen, fsave;
Panel p;
Button btnOpen, btnSave;
public CommonDialog() {
p = new Panel();
btnOpen = new Button("파일 열기");
btnSave = new Button("파일 저장");
fopen = new FileDialog(this, "파일 열기", FileDialog.LOAD);
fsave = new FileDialog(this, "파일 저장", FileDialog.SAVE);
p.add(btnOpen);
p.add(btnSave);
add(p);
btnOpen.addActionListener(this);
btnSave.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("파일 열기")){
fopen.setVisible(true);
System.out.println(fopen.getDirectory());
System.out.println(fopen.getFile());
}
else{
fsave.setVisible(true);
}
}
public static void main(String[] args) {
// TODO FileDialog 예제
CommonDialog common = new CommonDialog();
common.setSize(300, 400);
common.setVisible(true);
}
}
============================================================================
FrameTest
============================================================================
package container;
import java.awt.Button;
import java.awt.Frame;
public class FrameTest {
Button b;
Frame f;
FrameTest(){
f = new Frame();
b = new Button("눌러 주세요");
f.add(b);
f.setSize(200, 300);
f.setVisible(true);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
f.dispose();
}
public static void main(String[] args) {
// TODO Frame컨테이너 예제
new FrameTest();
}
}
============================================================================
PanelTest
============================================================================
package container;
import java.awt.Button;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class PanelTest extends Frame implements ActionListener{
Panel p1, p2;
Button b1, b2, b3, b4;
PanelTest(){
setLayout(new FlowLayout());
p1 = new Panel();
p2 = new Panel();
b1 = new Button("패널2 보이기");
b2 = new Button("패널2 안보이기");
b3 = new Button("패널1 보이기");
b4 = new Button("패널1 안보이기");
p1.setBackground(Color.CYAN);
p2.setBackground(Color.LIGHT_GRAY);
p1.add(b1);
p1.add(b2);
p2.add(b3);
p2.add(b4);
add(p1);
add(p2);
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
b4.addActionListener(this);
setSize(400, 500);
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
//System.out.println(e);
//Button b = (Button)e.getSource();
//String lab = b.getLabel();
String lab = e.getActionCommand();
if(lab.equals("패널2 보이기")){
p2.setVisible(true);
}
else if(lab.equals("패널2 안보이기")){
p2.setVisible(false);
}
else if(lab.equals("패널1 보이기")){
p1.setVisible(true);
}
else{
p1.setVisible(false);
}
}
public static void main(String[] args) {
// TODO Panel 예제
new PanelTest();
}
}
============================================================================UserDialog
============================================================================
package container;
import java.awt.Button;
import java.awt.Color;
import java.awt.Dialog;
import java.awt.Frame;
import java.awt.Label;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
class MessageDialog extends Dialog implements ActionListener{
String message;
Button btnClose;
public MessageDialog(Frame f, String msg) {
super(f, "메시지 대화상자", true);
message = msg;
btnClose = new Button("종료");
btnClose.addActionListener(this);
}
public void dialogUI(){
Label lab = new Label(message);
add("North", lab);
add(btnClose);
setBackground(Color.LIGHT_GRAY);
setSize(300, 150);
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
dispose();
}
}
public class UserDialog extends Frame implements ActionListener{
Panel p;
Button btnOpen, btnClose;
public UserDialog() {
p = new Panel();
btnOpen = new Button("다이얼로그 열기");
btnClose = new Button("종료");
p.add(btnOpen);
p.add(btnClose);
add(p);
btnOpen.addActionListener(this);
btnClose.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("다이얼로그 열기")){
MessageDialog md = new MessageDialog(this, "이것은 테스트 입니다.");
md.dialogUI();
}
else{
System.exit(0);
}
}
public static void main(String[] args) {
UserDialog user = new UserDialog();
user.setSize(500, 600);
user.setVisible(true);
}
}
============================================================================
BorderLayoutTest
============================================================================
package layout;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
public class BorderLayoutTest extends Frame{
Button b1,b2,b3,b4,b5;
public BorderLayoutTest(){
setLayout(new BorderLayout());
b1 = new Button( " 첫번째 버튼 " );
b2 = new Button( " 두번째 버튼 " );
b3 = new Button( " 세번째 버튼 " );
b4 = new Button( " 네번째 버튼 " );
b5 = new Button( " 다섯번째 버튼 " );
add("North",b1);
add("South",b2);
add("East",b3);
add("West",b4);
add("Center",b5);
setSize(300, 300);
setVisible(true);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new BorderLayoutTest();
}
}
============================================================================
CardLayoutTest
============================================================================
package layout;
import java.awt.Button;
import java.awt.CardLayout;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class CardLayoutTest extends Frame implements ActionListener{
CardLayout card;
Panel p1,p2;
Button btnPrev,btnNext;
Button b3, b4, b5;
public CardLayoutTest(){
p1 = new Panel();
p2 = new Panel();
btnPrev = new Button("prev page");
btnNext = new Button("next page");
card = new CardLayout();
b3 = new Button( " 1 - Page ");
b4 = new Button( " 2 - Page ");
b5 = new Button( " 3 - Page ");
p1.add(btnPrev);
p1.add(btnNext);
add("North", p1);
p2.setLayout(card);
p2.add("1", b3);
p2.add("2", b4);
p2.add("3", b5);
add(p2);
btnPrev.addActionListener(this);
btnNext.addActionListener(this);
b3.addActionListener(this);
b4.addActionListener(this);
b5.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("prev page")){
card.previous(p2);
}
else{
card.next(p2);
}
}
public static void main(String[] args) {
CardLayoutTest card = new CardLayoutTest();
card.setSize(300,400);
card.setVisible(true);
}
}
============================================================================FlowLayoutTest
============================================================================
package layout;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
public class FlowLayoutTest extends Frame{
Button b1,b2,b3,b4,b5;
public FlowLayoutTest(){
setLayout(new FlowLayout(0));
b1 = new Button( " 첫번째 버튼 " );
b2 = new Button( " 두번째 버튼 " );
b3 = new Button( " 세번째 버튼 " );
b4 = new Button( " 네번째 버튼 " );
b5 = new Button( " 다섯번째 버튼 " );
add(b1);
add(b2);
add(b3);
add(b4);
add(b5);
setSize(300, 300);
setVisible(true);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new FlowLayoutTest();
}
}
============================================================================GridLayoutTest
============================================================================
package layout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.GridLayout;
public class GridLayoutTest extends Frame{
Button b1,b2,b3,b4,b5;
public GridLayoutTest(){
setLayout(new GridLayout(2,3));//2행 3열로 배치
b1 = new Button( " 첫번째 버튼 " );
b2 = new Button( " 두번째 버튼 " );
b3 = new Button( " 세번째 버튼 " );
b4 = new Button( " 네번째 버튼 " );
b5 = new Button( " 다섯번째 버튼 " );
add("North",b1);
add("South",b2);
add("East",b3);
add("West",b4);
add("Center",b5);
setSize(300, 300);
setVisible(true);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new GridLayoutTest();
}
}
|
2015년 10월 21일 수요일
150923 쓰레드 윈도우 프로그래밍
피드 구독하기:
댓글 (Atom)
댓글 없음:
댓글 쓰기