프로세스 : 실행중인 프로그램
프로그램이 실행중인 상태
운영체제가 프로그램의 명령어들이 실행될 수있는환경을 만든다. 메모리를 구성해주고
데이터를 꺼내서 실행을 시킨다.
쓰레드 : 프로세스 내에서 실제 작업을 수행
프로그램이 실행되는 흐름
명렁어들이 순서대로 쭉 나열하고 있는 형식
모든 프로세스는 하나 이상의 쓰레드를 가지고 있다.
싱글쓰레드 : 쓰레드가 1개인 프로세스
멀티쓰레드 : 쓰레드가 여러개 있는것.
멀티태스킹(멀티 프로세스, 멀티 쓰레드가 포함됨) : 동시에 수행하는 것
멀티프로세스 : 컴퓨터에 여러 프로그램이 동시에 수행중임
멀티쓰레드 : 하나의 프로그램 안에서 동시에 여러 작업을 할수 있는 것.
쓰레드가 많이 쓰이는 프로그램 : 게임
멀티프로세스는 새로운 프로세스를 계속 만들어야하고.. 자원을 많이쓰게된다.
대부분 프로그램들이 멀티쓰레드를 사용한다.
멀티쓰레드의 장단점
장점 : 자원을 보다 효율적으로 사용할 수 있다.
사용자에 대한 응답성이 향상된다. = 일을 시킬때 처리시간이 빨라진다.
작업이 분리되어 코드가 간결해진다.
단점 : 동기화에 주의해야한다.
동기화.. 작업 => 은행에서 출금하는 프로그램이 있을때
교착상태 : 동기화 잘 못했을 때.. 다른작업을 수행해야하는데 락이 걸려이었어서 계속 대기중
=> 프로그램이 멈춘것 처럼 보인다.
쓰레드가 골고루 실행되게 해야한다.
고려해야할 사항이 많아진다.
쓰레드의 구현과 실행
: 자바에서는 쓰레드를 처리하기 위해 2가지 방법이 있다.
1) 쓰레드 클래스를 상속받는다.
2) Runnable 인터페이스를 구현한 클래스를 만들어서 작동시킨다.
=> 둘다 공통적으로 run()메서드를 오버라이딩(재정의)한다.
운영체제에서 보면 자바도 프로세스중 하나이다.
자바는 JVM만 있다면 어떤 운영체제에서도 동작한다.
프로세스 : 프로그램이 실행되서 돌아가고 있는 상태. 컴퓨터가 어떤 일을 실행하고 있는 상태
운영체제는 여러개의 프로그램의 프로세스를 돌리고 있다.
한 프로세스 내에서도 여러 갈래의 작업들이 진행되는 것.
여기서 갈래가 쓰레드이다.
프로세스 : 메모리에 올라가서 cpu가 처리중인 프로그램
작업관리자 창에서 현재 진행중인 프로그램을 볼 수 있다.
프로세스가 몇개 동작중이다.
쓰레드 : 쓰레드라는 단위로 처리중이다.
main { 메인메서드의 처음부터 끝까지 동작 }
멀티 쓰레딩 : 하나의 프로그램이 여러개의 쓰레드를 가지고 동작을 시킬 수 있음.
쓰레드 a,b,c,d 가 있을 때 cpu가 싱글 쓰레딩 방식만 처리한다면
첫번째 a.쓰레드를 시작시켜서 a쓰레드를 다 처리할때까지는 bcd를 대기시킨다.
멀티 쓰레딩 방법
- 코어가 많으면 쓰레드를 여러개 동작시킬때 좀더 효율적인 운영이 가능하다.
- 쓰레드가 여러개가 있을 때 이 프로그램 하나를 프로세스로 동작시킨다면
cpu가 a쓰레드 내용 1,2,3 번 정도 실행하고 다른 쓰레드들을 부분적으로 실행하고 돌아와서 다시 작업하고
왔다갔다 하면서 처리 = 동시에 처리하는 것 처럼 보인다.
하나의 cpu는 하나의 명령만 처리하는게 기본이다. 하지만 cpu는 그것을 돌아다니면서 실행하는 것
그게 너무 빨라서 동시에 처리되는것 처럼 보인다.
하나의 프로세스가 1개 이상의 쓰레드를 가질 수 있다.
멀티쓰레딩의 개념을 활용하면 메인이 시작되서 끝날 때까지 하는 작업과 동시에 다른 작업도 같이 수행되게 만들 수 있다.
1. 특정기능을 가지는 클래스에 대해서 쓰레드를 상속해서 만든다.
2. run( )이라는 메서드를 오버라이딩 한다. => 추가 작업 쓰레드
메인쓰레드와 동시에 같이 작업할수 있는애
3. 쓰레드 객체 생성
4. 해당 쓰레드의 run( )을 호출하는 것이 아니라 start( )라는 메서드를 호출한다.
=> 새로운 쓰레드로 해당 클래스가 가지고 있는 run( )메서드를 수행시킨다.
5. 실행하면 메인이 실행하는 중에 조금씩 다른 쓰레드작업이 실행됨
Runnable 인터페이스
이 쓰레드가 어떤 다른 클래스를 상속하고 있는거라면
쓰레드 b는 Runnable을 구현했기 때문에 start라는 메서드가 없다. => 쓰레드 그냥 생성(new Thread)
=> 생성자에 Runnable을 구현한 객체를 전달해 주면 그 객체에 정의되어 있는 run이 동작할 수 있다.
자바에서 멀티 쓰레드가 필요하다면 Thread 클래스를 상속(extends)하여 run()을 재정의하거나 Runnable 인터페이스를 구현(implements)해서 run()을 재정의한 다음에 / 결과적으로 쓰레드 객체가 갖고있는 쓰래드 클래스에 정의된 start()를 호출하면 각각의 run()메서드가 동작 할 때 새로운 쓰레드로 진행한다.
=> 쓰레드 상태, 데몬 쓰레드, 웨이트wait, join 등 쓰레드 들에 대한 ,관계가 있음
우선순위 개념(priority), 싱크로 나이즈(동기화) 개념, 교착상태
쓰레드를 많이 사용하는 프로그램 = 웹서핑하면서 웹페이지에서 파일 다운로드 할 때
예제) Ex13_1
1) 쓰레드 클래스 작성
//1. 쓰레드 클래스를 상속해서 쓰레드 구현
class ThreadEx1_1 extends Thread{
public void run() {
//run() { : 쓰레드가 수행할 작업을 작성 }
for (int i = 0; i < 500; i++) {
//getName() = 쓰레드 이름/조상인 Thread가 가지고 있는 메서드
// System.out.println(getName());
System.out.print(0);
}
}
}
//2. Runnable인터페이스를 구현해서 쓰레드를 구현
class ThreadEx1_2 implements Runnable {
@Override
public void run() {
//run() { : 쓰레드가 수행할 작업을 작성 }
for (int i = 0; i < 500; i++) {
//Thread.currentThread() : 현재 실행중인 Thread를 반환
// System.out.println(Thread.currentThread().getName());
System.out.print(1);
//쓰레드를 상속받지 않아서 Thread.currentThread()를 써줘야지
//Thread.currentThread()에 접근할 수 있다.
}
}
}
// 두가지 방법 다 run( )을 작성한다.
2) 메인 메서드 실행
- 쓰레드의 객체 생성
Ex1-1(Thread상속) 은 그냥 객체 생성
Ex1-2 (Runnable 구현)은 생성자 뭐 만들어서 쓰레드에 넣어준다...
public class Ex13_1 {
//쓰레드
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();
/*
실행결과
쓰레드의 이름 출력
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-1
Thread-1
Thread-1
Thread-1
Thread-1
*/
}
}
0과 1이 섞여서 나온다.
▶ 쓰레드를 사용안하고 그냥 메인메서드에서 for문 돌린 경우
public class Ex13_1 {
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)
// 쓰레드를 사용안하고 메인메서드에서 실행할 경우
for (int i = 0; i < 500; i++) {
System.out.print(0);
}
for (int i = 0; i < 500; i++) {
System.out.print(1);
}
}
}
0과 1이 섞이지 않고 차례대로 실행된다.
메인메서드의 쓰레드가 종료되어도
다른 쓰레드가 실행중이면 프로그램은 종료되지 않는다.
▶ 싱글 쓰레드
public class Ex13_2 {
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
for (int i = 0; i < 300; i++) {
System.out.printf("%s", new String("-"));
}
System.out.println("소요시간 1 : " + (System.currentTimeMillis() - startTime));
for (int i = 0; i < 300; i++) {
System.out.printf("%s", new String("|"));
}
System.out.println("소요시간 2 : " + (System.currentTimeMillis() - startTime));
}
}
멀티쓰레드로 작성하면
입력하는 작업으로 작업중지 상태여도 다른 작업 수행가능하다.
예제) 13_5
public class Ex13_5 {
//멀티쓰레드
public static void main(String[] args) {
ThreadEx5_1 th1 = new ThreadEx5_1();
th1.start();
String input = JOptionPane.showInputDialog("아무값이나 입력");
System.out.println("입력하신 값은 " + input + "입니다.");
}
}
class ThreadEx5_1 extends Thread{
public void run() {
for (int i = 10; i > 0; i--) {
System.out.println(i);
try {
sleep(1000);
} catch (Exception e) {
}
}
}
}
쓰레드의 우선순위는 크게 기대하지 말자(희망사항임)
데몬쓰레드(보조역할)
메인-일반쓰레드가 종료되면 프로그램이 종료된다.
'고급JAVA' 카테고리의 다른 글
쓰레드 공부-03 : 쓰레드의 실행제어 (0) | 2022.12.27 |
---|---|
쓰레드 공부-02 (1) | 2022.12.26 |
[JAVA] Collection - Properties (0) | 2022.12.22 |
[JAVA] 가변형인수 Varargs (0) | 2022.12.22 |
[JAVA] Map (1) | 2022.12.21 |