Fairy ' s
[JAVA] Thread ? 본문
Thread
Thread
- 스레드란 프로세스 내에서 실행되는 흐름의 단위이고, main() 안의 실행문들이 하나의 스레드이다.
- 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다.
- main() 이외의 스레드를 만드는 방법 : Thread 클래스 상속 , Runnable 인터페이스 구현
Thread 클래스 상속
// import 생략
// DownloadThread 상속
import test.thread.DownloadThread;
public class Frame01 extends JFrame implements ActionListener {
public Frame01() {
setTitle("Frame01");
setBounds(100, 100, 800, 500);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(new FlowLayout());
JTextField inputText=new JTextField(10);
add(inputText);
JButton btn1=new JButton("눌러보셈");
add(btn1);
btn1.addActionListener(this);
setVisible(true);
}
public static void main(String[] args) {
new Frame01();
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("버튼을 눌렀네요!");
//새로운 스레드에서 다운로드 작업을 시킨다.
new DownloadThread().start();
System.out.println("actionPerformed() 메소드가 종료 됩니다.");
}
}
// DownloadTherad.java
public class DownloadThread extends Thread{
@Override
public void run() {
//완료하는데 10초가 걸리는 작업을 한다고 가정하자
try {
Thread.sleep(10000);
System.out.println("다운로드가 완료 되었습니다.");
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
- Thread를 상속받은 클래스를 만들어준 후 main()에서 .start()를 사용하여 실행
Thread 클래스 상속 받지 않고 main() 내에서 바로 사용
// import 생략
// DownloadThread 상속
import test.thread.DownloadThread;
public class Frame05 extends JFrame implements ActionListener{
//생성자
public Frame05() {
setTitle("Frame05");
setBounds(100, 100, 800, 500);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(new FlowLayout());
JTextField inputText=new JTextField(10);
add(inputText);
JButton btn1=new JButton("눌러보셈");
add(btn1);
btn1.addActionListener(this);
setVisible(true);
}
public static void main(String[] args) {
new Frame05();
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("버튼을 눌렀네요!");
//익명의 내부 클래스를 이용해서 객체 생성후 새로운 작업단위를 시작한다.
new Thread() {
@Override
public void run() {
//완료하는데 10초가 걸리는 작업을 한다고 가정하자
try {
Thread.sleep(10000);
System.out.println("다운로드가 완료 되었습니다");
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}.start();
System.out.println("actionPerformed() 메소드가 종료 됩니다.");
}
}
- new Thread를 이용하여 익명의 내부 클래스를 이용해서 객체 생성
Runnable 인터페이스 사용
// CountRunnable.java
public class CountRunnable implements Runnable{
@Override
public void run() {
int count=0;
while(true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
count++; //카운트를 증가 시킨다.
System.out.println("현재 카운트:"+count);
if(count==10) break;
// 카운트가 10이 되면 반복문 탈출 => run()메소드종료 => 스레드 종료를 의미
}
}
}
- Runnable 인터페이스에서 run을 오버라이드해주었다.
// import 생략
// CountRunnable, DownloadThread 상속
import test.runnable.CountRunnable;
import test.thread.DownloadThread;
public class Frame02 extends JFrame implements ActionListener{
//생성자
public Frame02() {
setTitle("Frame02");
setBounds(100, 100, 800, 500);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(new FlowLayout());
JTextField inputText=new JTextField(10);
add(inputText);
JButton btn1=new JButton("눌러보셈");
add(btn1);
btn1.addActionListener(this);
setVisible(true);
}
public static void main(String[] args) {
new Frame02();
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("버튼을 눌렀네요!");
Thread t=new Thread(new CountRunnable());
t.start();
System.out.println("actionPerformed() 메소드가 종료 됩니다.");
}
}
- 버튼을 누르면 이벤트가 발생하고, 버튼을 눌렀다는 메시지와 CountRunnable 클래스가 같이 실행된다.
- CountRunnable 클래스를 통해 콘솔창에서 숫자가 1부터 10까지 1초마다 증가하고 10이되면 반복문을 탈출한다.
Runnable 클래스를 만들지 않고 main에서 사용
// import 생략
// CountRunnable, DownloadThread 상속
import test.runnable.CountRunnable;
import test.thread.DownloadThread;
public class Frame02 extends JFrame implements ActionListener{
//생성자
public Frame02() {
setTitle("Frame06");
setBounds(100, 100, 800, 500);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(new FlowLayout());
JTextField inputText=new JTextField(10);
add(inputText);
JButton btn1=new JButton("눌러보셈");
add(btn1);
btn1.addActionListener(this);
setVisible(true);
}
public static void main(String[] args) {
new Frame02();
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("버튼을 눌렀네요!");
new Thread(new Runnable() {
@Override
public void run() {
int count=0;
while(true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
count++; //카운트를 증가 시킨다.
System.out.println("현재 카운트:"+count);
if(count==10) break;
// 카운트가 10이 되면 반복문 탈출 => run()메소드종료 => 스레드 종료를 의미
}
}
}).start();
System.out.println("actionPerformed() 메소드가 종료 됩니다.");
}
}
- main 에서 run() 을 만들어 클래스를 따로 생성하지 않고 main() 내에서 바로 실행
'Study > JAVA' 카테고리의 다른 글
[JAVA] 입출력스트림 (0) | 2023.01.11 |
---|---|
[JAVA] Exception / try ~ catch (0) | 2023.01.11 |
[JAVA] Wrapper Class ? (0) | 2023.01.11 |
[JAVA] Generics Class ? (0) | 2023.01.10 |
[JAVA] ArrayList ? (0) | 2023.01.10 |
Comments