티스토리 뷰
Concurrent 소프트웨어
- 동시에 여러 작업을 할 수 있는 소프트웨어
ex) 웹 브라우저로 유튜브 보며 키보드로 문서에 타이핑, 녹화를 하면서 코딩을 하고 적어둔 문서를 보거나 수정
자바에서 지원하는 Concurrent 프로그래밍
- 멀티프로세싱
- 멀티스레드
자바 멀티스레드 프로그래밍
- Thread / Runable
Thread 만드는 방법 1. - 상속(매우 불편)
public class App {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
System.out.println("Hello Thread" );
}
static class MyThread extends Thread{
@Override
public void run() {
System.out.println("Thread " + Thread.currentThread().getName());
}
}
}
방법2. Runnable구현 (스레드 생성자에 Runnable을 준다)
public class App {
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Thread : " + Thread.currentThread().getName());
}
});
thread.start();
System.out.println("Hello Thread" + Thread.currentThread().getName() );
}
}
-> 스레드는 순서를 보장하지 않아 보기의 결과같이 나올 수 있음
스레드의 주요기능1. sleep
public class App {
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000L);
} catch (InterruptedException e) { /// 깨우는거
e.printStackTrace();
}
System.out.println("Thread : " + Thread.currentThread().getName());
}
});
thread.start();
System.out.println("Hello Thread" + Thread.currentThread().getName() );
}
}
->1초 재우고 실행되는거라 높은 확률로 main이 거의 먼저실행됨
- 현재 스레드 멈춰두기
스레드 주요기능 2. interrupt
public class App {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (true){
System.out.println("Thread : " + Thread.currentThread().getName());
try {
Thread.sleep(1000L);
} catch (InterruptedException e) { /// 깨우는거
System.out.println("exit!");
return;
}
}
}
});
thread.start();
System.out.println("Hello : " + Thread.currentThread().getName() );
Thread.sleep(3000L);
thread.interrupt();
}
}
-> 무한루프에서 3초후 InterruptedException발생시켜 exit 찍히도록
- 다른 스레드를 개워서 InterruptedException을 발생시킨다
스레드 주요기능 3. join
public class App {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Thread : " + Thread.currentThread().getName());
try {
Thread.sleep(3000L);
} catch (InterruptedException e) { /// 깨우는거
throw new IllegalStateException(e);
}
}
});
thread.start();
System.out.println("Hello : " + Thread.currentThread().getName() );
thread.join();//기다릴 스레드를 조인하면됨
System.out.println(thread + " is finished");
}
}
- 다른 스레드가 끝날때까지 기다린다
강의 : 인프런 더 자바, Java8
*기본이지만 짚고넘어갈 부분*
#스레드와 프로세스의 차이 (요즘 면접에서 많이 물어봄)
프로그램 -> 프로세스 -> 스레드
- 프로그램은 메모리 할당이 안된 코드 덩어리
- 프로세스는 메모리에 올라와 실행되고 있는 실행중인 프로그램의 인스턴스
- 그 포로세스에서 실행되는 독립적인 실행단위를 스레드라고 함(프로세스는 하나 이상의 스레드를 가짐)
- 즉, 프로세스의 특정한 수행 경로
-> 프로세스 내에서 실행되는 각각의 일을 스레드라고 하고, 프로세스 내에서 실행되는 세부 작업 단위로 여러개의 스레드가 하나의 프로세스를 이루게 되는 것
https://gmlwjd9405.github.io/2017/10/01/basic-concepts-of-development-os.html
↑ 이 두곳에 잘 설명되어 있음
'Java' 카테고리의 다른 글
[Java8] CompletableFuture-Concurrent 프로그래밍3. Callable과 Future (0) | 2021.12.08 |
---|---|
[Java8] CompletableFuture-Concurrent 프로그래밍2. Execurtors (0) | 2021.12.08 |
[Java8] Optional 소개 및 API (0) | 2021.07.18 |
[Java8] Stream API 예제 (0) | 2021.07.10 |
[Java8] Stream API (0) | 2021.07.10 |
- Total
- Today
- Yesterday