프로세스란 단순히 실행 중인 프로그램
즉, 사용자가 작성한 프로그램이 운영체제에 의해 메모리 공간을 할당받아 실행 중인 것을 말합니다.
프로세스는 프로그램에 사용되는 데이터와 메모리 등 자원 그리고 스레드로 구성됩니다.
스레드란 프로세스 내에서 실제로 작업을 수행하는 주체를 의미
모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행합니다.
또한 두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스라고합니다.
ex)
프로세스 : 쓰레드 = 공장 : 일꾼
싱글 쓰레드 프로세스
= 자원 + 쓰레드
멀티 쓰레드 프로세스
= 자원 + 쓰레드+쓰레드+...+쓰레드
멀티 쓰레드 중요한점 : 단점을 보안해야한다.
장점 : 가성비 좋음, 시스템 자원을 보다 효율적으로 사용
사용자에 대한 응답성이 향상(ex 카톡에서 대화중에 파일전송도 할수있음)
작업이 분리되어 코드가 간결해 진다.
단점 :
공유하는데서 문제가 발생
여러 일꾼이 한개 공장에서 공구를 가지고 일하다 보니 문제점이 발생
동기화에 주의해야한다.
교착 상태가 발생하지 않도록 주의해야한다.( ex 공구 사용 겹침)
기아(특정 쓰레드가 동작이 안되는 상태,기회가 다 뺏겨서 )상태가 오지않도록 주의야한다.
쓰레드의 구현과 실행
1. Thread클래스를 상속 >> 자바는 단일 상속이라서 인터페이스가 더 효율적이다.
Thread를 상속받아서 start 메소드를 구현하려면 그냥 this.getName을 적어도 된다.
2. Runnable 인터페이스를 구현 (better)
1,2번 둘다 run() 메소드 작성 >> 쓰레드가 수행할 작업을 작성 이말이다.
Thread의 메소드인 start 메소드를 구현하려면
runnable은 Thread를 상속받지 않아서 getName에 접근할때는
Thread.currentThread().getName()으로 접근한다.
class ThreadWithClass extends Thread { // 1.Thread 클래스 상속해서 사용할때의 양식
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(getName()); // 현재 실행 중인 스레드의 이름을 반환함.
try {
Thread.sleep(10); // 0.01초간 스레드를 멈춤.
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class ThreadWithRunnable implements Runnable { // 2.runnable 인터페이스 를 통해 구현하는 방법
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName());
// runnable 인터페이스로 start()메소드 작동하려면 Thread.currentThread()
이렇게 불러와야한다.
// 현재 실행 중인 스레드의 이름을 반환함.
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Thread01 {
public static void main(String[] args){
ThreadWithClass thread1 = new ThreadWithClass();
// Thread 클래스로 생성해서 구현하는 방법
Thread thread2 = new Thread(new ThreadWithRunnable());
// Runnable 인터페이스를 구현하는 방법
thread1.start(); // 스레드의 실행
thread2.start(); // 스레드의 실행
}
}
------
Thread-0
Thread-1
Thread-0
Thread-1
Thread-0
Thread-1
Thread-0
Thread-1
Thread-0
Thread-1
--------
위의 예제 실행 결과를 살펴보면, 생성된 쓰레드가 서로 번갈아 가며 실행 되고 있는것을 확인할 수 있습니다.
Thread 클래스를 상속받으면 다른 클래스를 상속 받을수 없으므로, 일반적으로
Runnable 인터페이스를 구현하는 방법으로 스레드를 생성합니다.
Runnable 인터페이스는 몸체가 없는 메소드인 run() 메소드 단 하나만을
가지는 간단한 인터페이스입니다.
스레드의 우선순위 >> priority
class ThreadWithRunnable implements Runnable {
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName());
// 현재 실행 중인 스레드의 이름을 반환함.
try {
Thread.sleep(10); //sleep 메소드를 사용하면 InterruptedException 예외를 잡고 시작한다
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Thread02 {
public static void main(String[] args){
Thread thread1 = new Thread(new ThreadWithRunnable());
Thread thread2 = new Thread(new ThreadWithRunnable());
① thread2.setPriority(10); // Thread-1의 우선순위를 10으로 변경함.
② thread1.start(); // Thre ad-0 실행
③ thread2.start(); // Thread-1 실행
4 System.out.println(thread1.getPriority()); // thread1우선순위 확인
5 System.out.println(thread2.getPriority()); // thread2우선순위 확인
// main 메소드의 4,5부터 출력이 되고 그다음 run()이 출력이 되는데 3번이 우선순위가 더 높아서
3-2-3-2 순으로 출력된다.
}
}
'java' 카테고리의 다른 글
스트림(stream) (0) | 2022.04.30 |
---|---|
멀티 쓰레드(Thread),데몬 쓰레드(deamon thread),쓰레드 그룹 (0) | 2022.04.28 |
properties (0) | 2022.04.27 |
Map 컬렉션 클래스 (0) | 2022.04.27 |
Set 컬렉션,HashSet,TreeSet (0) | 2022.04.26 |
댓글