Multi Thread 개념
- 하나의 program에서 동시에 여러 작업을 하는 것처럼 느끼게 해줌
ex) 이미지 바뀌는거, 멀티프로세싱과 비슷
⭐Thread 상태전이도(Life Cycle/생명주기)
New Born(새로 태어난 상태) t1 = new Thread1()
→ t1.start()
→ Runnable(실행가능한 상태) JVM Thread Scheduler
→ Running(실행중인 상태) run() { } } ⇒ while(true)로 만들어 놓기, 죽지않고 계속이용할 수 있음
→ Dead(죽은 상태)
+Block(휴면 상태)
- 실행가능할때( sleep(ms) , wait ), 실행중일 때 쉴수 있다.
- Runnable 상태일때만 돌아갈수 있음(시간 경과후 notifyAll)
⭐Thread 클래스 만드는 방법
- Thread(클래스) 상속받아서
class Thread Test1 extends Thread {
public void run() { //오버라이딩
}
}
ThreadTest1 t1 = new ThreadTest1(); //new born 상태
t1.start(); //runnable 상태
2. Runnable(인터페이스) 상속받아서
class ThreadTest2 implements Runnable{
public void run() {
//오버라이딩 안하면 에러남
}
}
=> 주로 다른 클래스를 상속받았을 때 사용
ThreadTest2 t2 = new ThreadTest2();
Thread t3 = new Thread(t2) // 두 문장을 써야 new born 상태
t3.start(); //runnable 상태
- 첫번째 방법_Thread(클래스) 상속받아서
TIP. run + ctrl + space 하면 바로 오버라이딩 됩니당
package thread.generate;
public class ThreadTest1 extends Thread {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("thread 실행" + (i + 1));
try {
sleep(500); //1000이 1초 500 0.5초
} catch (InterruptedException e) {
} // 0.5초
}
}
public static void main(String[] args) {
ThreadTest1 t1 = new ThreadTest1(); // new born 상태
t1.start(); // runnable 상태
}
}
결과 => 0.5초 동안 천천히 나옴.
sleep 상태가 없다면 바로 나오게 됨
Exception(예외)
발생 시점 2가지
- compile Time(코드중) = CheckedException
- Thread
- JDBC
- NetWork
- IO(input, output)
- run Time(실행중)
- ArrayIndexOutOfBoundsException
- Arithmetic Exception 산술( /zero)
- NullPointerException 참조값 대입 안했을 때
Exception handing(예외처리) 방법
try{
//예외 발생 가능성이 있는 문장, 불가능한 문장도 괜춚
}catch(InterruptedException e){
//예외처리 한후 e에 전달
}catch(Expection e){
//다른 예외가 발생하면 실행, 예외가 발생하지 않는다면 실행 X
}finally{
}
아래에서 위로부터 부모(상위 클래스) → 자식(하위 클래스)
- 2번째 방법
package thread.generate;
public class ThreadTest2 implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("Runnable을 사용한 Thread 실행 " + (i + 1));
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
} //0.2초
}
}
public static void main(String[] args) {
ThreadTest2 t2 = new ThreadTest2();
Thread t3 = new Thread(t2);
t3.start();
}
}
=> 0.2초동안 천천히 나옴
<시간에 따라 사진이 바뀌는 프로그램>
먼저 JFrame으로 상속받아주기
그 다음 생성자 만들어주기
public class ImageSlideShow extends JFrame {
JLabel lbl;
JTextField tf;
int time;
ImageThread t;
public ImageSlideShow() {
JPanel pan = new JPanel();
tf = new JTextField(5);
JButton btnTime = new JButton("시간 설정");
btnTime.addActionListener(btnL);
pan.add(tf);
pan.add(btnTime);
add(pan, "North");
ImageIcon icon = new ImageIcon("imgs/yeonJun1.jpg");
lbl = new JLabel(icon);
add(lbl, "Center");
setTitle("이미지슬라이드쇼");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setBounds(20, 30, 400, 400); // 화면 크기
setVisible(true); // 화면 나타내기
setResizable(false); // 크기 안바뀌게
t = new ImageThread(lbl);
t.start();
}
생성자 안에 JPanel, JTextField, JButton, Icon 만들어주기
그리고 JFrame 윈도우 설정하기
public static void main(String[] args) {
new ImageSlideShow();
}
그리고 main에 IMageSlideShow 불러오기
ActionListener btnL = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
time = (int) (Double.parseDouble(tf.getText())*1000);
t.setTime(time);
}
};
}
그 다음 버튼 이벤트 발생하게 만들어주기
그 다음 Thread가 발생할 클래스 만들어주기 +Thread로 상속 받아주기
package thread.slideshow;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
public class ImageThread extends Thread {
JLabel lbl;
int time = 1000;
public ImageThread(JLabel lbl) {
this.lbl = lbl;
}
public int getTime() {
return time;
}
public void setTime(int time) {
this.time = time;
}
JLabel 만들어주고 입력받을 시간을 time로 만들어주기
그리고 getTime과 setTime 만들어주기
@Override
public void run() {
int i = 1;
ImageIcon icon;
while(true) {
icon = new ImageIcon("imgs/yeonJun" + i++ + ".jpg" );
lbl.setIcon(icon);
if(i == 5) {
i = 1;
}
try {
sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
이제 오버라이딩해서 만들어주기
<완성된 코드>
package thread.slideshow;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class ImageSlideShow extends JFrame {
JLabel lbl;
JTextField tf;
int time;
ImageThread t;
public ImageSlideShow() {
JPanel pan = new JPanel();
tf = new JTextField(5);
JButton btnTime = new JButton("시간 설정");
btnTime.addActionListener(btnL);
pan.add(tf);
pan.add(btnTime);
add(pan, "North");
ImageIcon icon = new ImageIcon("imgs/yeonJun1.jpg");
lbl = new JLabel(icon);
add(lbl, "Center");
setTitle("이미지슬라이드쇼");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setBounds(20, 30, 400, 400); // 화면 크기
setVisible(true); // 화면 나타내기
setResizable(false); // 크기 안바뀌게
t = new ImageThread(lbl);
t.start();
}
public static void main(String[] args) {
new ImageSlideShow();
}
ActionListener btnL = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
time = (int) (Double.parseDouble(tf.getText())*1000);
t.setTime(time);
}
};
}
package thread.slideshow;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
public class ImageThread extends Thread {
JLabel lbl;
int time = 1000;
public ImageThread(JLabel lbl) {
this.lbl = lbl;
}
public int getTime() {
return time;
}
public void setTime(int time) {
this.time = time;
}
@Override
public void run() {
int i = 1;
ImageIcon icon;
while(true) {
icon = new ImageIcon("imgs/yeonJun" + i++ + ".jpg" );
lbl.setIcon(icon);
if(i == 5) {
i = 1;
}
try {
sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
<결과>
아직 배운지 얼마 안돼서 설명이 미숙한 부분이 있지만 나중에 다시 한 번 정리해서 글 올리도록 하겠습니다!
'AfterSchool > 자바 방과후' 카테고리의 다른 글
방과후 8일차_경마 게임 만들기 (2) | 2023.01.04 |
---|---|
Vending machine GUI로 만들기(1231) (2) | 2023.01.03 |
깃허브 쓰는법, Vending Machine 로직소스 만들기(1230) (0) | 2022.12.30 |
성적프로그램과 BMI프로그램 만들기(1229) (0) | 2022.12.29 |
Event Programming EventListener 4가지 방법과 도서 정보 관리 시스템(1228) (0) | 2022.12.28 |