프로세스는 프로그램을 수행하는데 필요한 데이터와 메모리 등의 자원과
쓰레드로 구성되어 있다.
⭐ 모든 프로세스는 최소한 하나이상의 쓰레드가 존재하며 둘 이상의 쓰레드를 멀티쓰레드라고한다.
공장 : 프로세스
쓰레드 : 일꾼
멀티쓰레드 : 자원 + 쓰레드 + 쓰레드 + 쓰레드
📌멀티쓰레딩의 장점
CPU 효율을 높일 수 있다.
사용자에 대한 응답이 향상된다.
작업이 분리되서 코드가 간결해지고 유지보수가 편해진다.
ex) 메신저로 채팅하면서 파일을 주고받을 수 있는 이유는 프로세스가 멀티쓰레드로 작성되어 있기 때문이다.
만약 메신저가 싱글쓰레드로 되어있다면 사용자가 요청을 할때마다 새로운 프로세스를 생성해야 하는데
이는 많은 수의 사용자의 요청을 서비스하기 어렵다.
하지만 멀티쓰레드는 동기화(synchronization) , 교착(deadlock)상태와 같은 문제들을 고려해서
신중히 코드를 작성해야 한다.
📌 쓰레드의 구현방법
1️⃣ Thread 클래스를 상속
2️⃣ Runnable 인터페이스를 implements
Thread 클래스의 상속
class MyThread extends Thread {
public void run () { /*작업내용... */}
}
Runnable 인터페이스
class MyThread implements Runnable{
public void run() { /* 작업내용 */}
}
두가지 중 어느 것을 선택해도 구현하는데 큰 어려움은 없지만
Thread 클래스를 상속받게되면 다른 부모클래스를 상속받지 못하기 때문에
가능하면 Runnable 인터페이스로 구현하는 것을 권장한다.
Runnable 인터페이스는 오로지 run()함수만 가지고있는 간단한 인터페이스이다.
쓰레드를 구현한다는 것은 쓰레드를 통해 작업하고자 하는 내용으로 run()의 빈 통을 채우는 것뿐이다.
class ThreadEx1_1 extends Thread {
@Override
public void run() {
for(int i =0; i< 5; i++) {
System.out.println(getName()); //조상인 Thread의 getname을 호출
}
}
}
class ThreadEx1_2 implements Runnable {
@Override
public void run() {
for(int i =0; i<5; i++) {
System.out.println(Thread.currentThread());
}
}
}
public class Ex01 {
public static void main(String[] args) {
ThreadEx1_1 t1 = new ThreadEx1_1();
Runnable r = new ThreadEx1_2();
Thread t2 = new Thread(r); //생성자 Thread(Runnable target)
t1.start();
t2.start();
}
}
쓰레드를 구현하는 방법 2가지를 전부 구현해보았다.
두가지 방법 모두 내장함수 run을 오버라이딩해서
run함수 내에 코드를 작성해서 main클래스에서 객체를 선언해서 Thread를 실행시킨다.
#️⃣ 사용자가 입력을 받는 작업과 화면에 출력하는 작업을 처리해야하는 코드를 작성해보자.
import javax.swing.JOptionPane;
public class Ex03 {
public static void main(String[] args) {
String input = JOptionPane.showInputDialog("아무값이나 입력하세요");
System.out.println("입력하신 값은 : " + input+ "입니다.");
for(int i =10; i>0; i--) {
System.out.println(i);
try {
Thread.sleep(2000);
} catch (Exception e) {
// TODO: handle exception
}
}
}
}
JOptionPane클래스의 showInputDialog내장함수로 입력폼함수로 입력을 받고
반복문으로 i를 출력하는 코드를 작성해서 실행해본다.
사용자가 입력을 받기전까지는 출력이 되지않는다.
사용자가 입력을 넣으면 그제서야 반복문 i가 출력된다.
사용자가 입력을 마치지않으면 기다리는 동안 쓰레드는 아무 일도 하지 않는다. 이것이 싱글 쓰레드다.
#️⃣ 쓰레드를 상속받은 클래스 하나를 생성해서 입력과 출력을 동시에 실행시켜보자.
import javax.swing.JOptionPane;
class ThreadEx01 extends Thread{
@Override
public void run() {
for(int i =0; i<5; i++) {
System.out.println(i);
try {
sleep(2000);
} catch (Exception e) {
// TODO: handle exception
}
}
}
}
public class Ex04 {
public static void main(String[] args) {
ThreadEx01 th1 = new ThreadEx01();
th1.start();
String input = JOptionPane.showInputDialog("아무값이나 입력하세요");
System.out.println("입력하신 값은 " + input + "입니다.");
}
}
쓰레드를 상속받은 ThreadEx01 클래스에서 run을 오버라이딩 하면서 반복문을 2초간격으로 띄우는 코드를 작성하고
main함수에서는 쓰레드 객체를 실행시키면서 동시에 사용자에게 입력받고있다.
사용자가 입력을 넣지않아도 쓰레드 객체인 th1은 이미 반복문을 출력시키고 있다.
1번 쓰레드의 사용자의 입력과 또 다른 2번 쓰레드 객체인 th1을 동시에 실행시켜서
많은 요청을 한번에 서비스하는 셈이다. 이것이 멀티쓰레드이다.
'JAVA기초' 카테고리의 다른 글
최근5개의 명령어를 보여주는 예제로 Queue 이해하기 (0) | 2023.09.02 |
---|---|
자바의 정석 개념정리 (예외처리 - 정규식) - 이론 (0) | 2023.08.23 |
CollectionFramework - LinkedList (2) | 2023.08.21 |
컬렉션 프레임워크 - ArrayList 복습, 개념정리(자바의정석) (0) | 2023.08.20 |
소켓프로그램 (ip출력해서 서버와 클라이언트 단방향 통신하기) (0) | 2023.06.27 |