- 동기 : 어떤 요청을 보낸 뒤, 그 요청의 결과값을 얻기까지 작업을 멈춤
- 비동기 : 어떤 요청을 보낸 뒤, 그 요청의 결과값을 얻기까지 멈추지 않고 다른 일을 수행하는 것
: 보조기억장치의 프로그램이 메모리 상으로 적재되어 실행되면 프로세스
: 프로세스별로 Code, Data, Stack, Heap Memory영역을 가지며 하나의 CPU를 점유하여 수행하게 된다.
즉, 프로세스란 현재 실행중인 프로그램을 의미 (완전히 독립적인 수행단위)
: 같은 Process 내에서 실행되는 여러 작업(흐름)의 단위
: 한 프로그램에 여러개의 스레드가 존재할 수 있다.
(스레드가 1개면 단일, 2개 이상이면 다중 스레드)
: 프로그램 코드를 한 줄씩 실행하는 것이 스레드의 역할(= 실행제어)
: 스레드란 곧 프로그램을 실행하는 주체
스레드는 공통적으로는 code, data, heap data를 공유하고,
각 스레드간에는 독립적인 register, stack 정보들을 관리
! 각 스레드는 다른 스레드에게 스택 메모리를 공유할 수 없음
!! 하지만, 프로세스의 힙은 속한 모든 스레드가 공유할 수 있음
!!! 프로세스 밖에서 스레드를 각각 제어할 수 없음
!!!! 잘못된 변수를 스레드간 공유해 오류가 발생할 수 있음
: 여러개의 스레드를 이용하는 프로그램
: 각각의 스레드는 하나의 독립적인 프로세스처럼 작업 수행
프로세스는 독립적임 > 프로세스끼리 자원 및 데이터를 공유하기 어려움
: 프로세스간 데이터 전송이 필요한 경우 시간과 자원의 소모가 많다.
하지만, 프로그램 내의 스레드는 서로 독립적이지 않음
스레드는 작업 공간을 같이 사용하기 때문에 자원 및 데이터를 공유할 수 있음
: 스레드간 데이터 전송이 필요한 경우 시간, 자원 소모가 적음
스레드는 프로세스처럼 작업을 동시에 처리할 수 있는 공통적인 특징을 가지면서, 프로세스보다 오버헤드가 적다는 것이 장점
1. 병행성 : 다수의 스레드 생성방법 존재
2. 동기화 : 작업이 방해받지 않고 각 스레드의 동기화 방법 존재
3. 통신 : 서로 다른 스레드가 정보를 교환할 수 있는 방법 존재
스레드는 각 태스크에 해당하는 스택 메모리를 할당받음
그리고 여러 작업을 동시에 수행할 일이 생기면 OS는 어떤 스레드 작업을 먼저 수행할지, 어떤 스레드를 더 많이 수행해야 효율적인지 스케쥴링(선점 스케줄링)을 해야함
생성자 | 내용 |
---|---|
Thread() | 일반적 스레드 객체 생성 |
Thread(Runnable target) | run메소드를 가지는 객체를 인자값으로 할당 |
Thread(Runnable target, String name) | run매소드를 가지는 객체와 스레드 이름을 인자값으로 할당 |
Thread(String name) | 스레드 생성하며 스레드 이름 지어주기 |
public class Test extends Thread{
@Override
public void run(){
/*스레드 실행 코드*/
}
}
public class Test implements Runnable{
@Override
public void run(){
/*스레드 실행 코드*/
}
}
public class FirstThread extends Thread{
@Override
public void run(){
System.out.println("1");
}
}
public class SecondThread implements Runnable{
@Override
public void run(){
System.out.println("2");
}
}
public class Test {
//내부 클래스 - Thread 상속받기
class ThirdThread extends Thread{
@Override
public void run() {
System.out.println("3");
}
}
//내부 클래스 - Runnable 구현
class fourthThread implements Runnable{
@Override
public void run() {
System.out.println("4");
}
}
//메인함수
public static void main(String[] args) {
Test t = new Test();
//스레드1
FirstThread th1 = new FirstThread();
th1.start();
//스레드2
SecondThread sec_thread = new SecondThread();
Thread th2 = new Thread(sec_thread);
th2.start();
//스레드3
ThirdThread th3 = t.new ThirdThread();
th3.start();
//스레드4
Thread th4 = new Thread(t.new fourthThread());
th4.start();
// new Thread(t.new fourthThread()).start();
/*
스레드5 - 익명 객체구현객체 방식으로 생성
Thread 생성시 인자값으로 Runnable을 구현하는 코드 삽입하기
*/
Thread th5 = new Thread(
new Runnable() {
@Override
public void run() {
System.out.println("5");
}
}
);
th5.start();
}
}
위 실행코드 결과는 다 랜덤이다 왜냐면 실행할 때마다 결과가 다르니깐
왜냐면 스레드 실행하는데 우선순위가 정해져 있지 않기 때문임
출처
https://makecodework.tistory.com/entry/Java-%EC%8A%A4%EB%A0%88%EB%93%9CThread-%EC%8A%A4%EB%A0%88%EB%93%9C-%EA%B0%9C%EB%85%90-%EB%B0%8F-%EC%83%9D%EC%84%B1%ED%95%98%EA%B8%B0
https://velog.io/@haero_kim/Thread-vs-Coroutine-%EB%B9%84%EA%B5%90%ED%95%B4%EB%B3%B4%EA%B8%B0