👉 프로세스: 실행 중인 프로그램, 자원(resources(메모리. CPU...))과 쓰레드로 구성
👉 쓰레드: 프로세스 내에서 실제 작업을 수행.(모든 프로세스는 최소한 하나의 쓰레드를 가지고 있다)
👉 싱글 쓰레드 프로세스 = 자원 + 쓰레드
👉 멀티 쓰레드 프로세스 = 자원 + 쓰레드 + 쓰레드 + ... + 쓰레드
👉 하나의 새로운 프로세스를 생성하는 것보다 하나의 새로운 쓰레드를 생성하는 것이 더 적은 비용이 든다.
👉장점:
시스템 자원을 보다 효율적으로 사용할 수 있다,
사용자에 대한 응답성(responseness)이 향상됨,
작업이 분리되어 코드가 간결해짐
👉단점:
동기화(synchronization)에 주의,
교착상태(dead_lock)가 발생하지 않도록 주의,
기아문제 : 각 쓰레드가 효율적으로 고르게 실행될 수 있게 해야함
- Thread클래스를 상속
class MyThread extends Thread{ public void run() { // Thread클래스의 run()을 오버라이딩 /* 작업내용 */ } }
MyThread t1 = new MyThread(); // 쓰레드의 생성 t1.start(); // 쓰레드의 실행
- Runnable인터페이스를 구현
class MyTread2 implements Runnable { public void run() { // Runnable인터페이스의 추상메서드 run()을 구현 /* 작업내용 */ } }
Runnable r = new MyThread2(); Thread t2 = new Thread(r); // Thread(Runnable r) // 한줄로하면 Thread t2 = new Thread(new MyThread2)); t2.start();
- 쓰레드를 생성한 후에 start()를 호출해야 쓰레드가 작업을 시작함
ThreadEx1_1 t1 = new ThreadEx1_1(); ThreadEx1_1 t2 = new ThreadEx1_1(); . t1.start(); t2.start();
class ThreadTest { public static void main(String[] args) { for(int i=0; i< 300; i++) System.out.print(new String("-")); } for(int i=0; i< 300; i++) System.out.print(new String("|")); } } }
public class ThreadTest { public static void main(String[] args) { ThreadEx1 th1 = new ThreadEx1(); ThreadEx2 th2 = new ThreadEx2(); . th1.start(); th2.start(); } } class ThreadEx1 extends Thread { public void run() { for(int i=0; i< 300; i++) System.out.print(new String("-")); } } } class ThreadEx1 extends Thread { public void run() { for(int i=0; i< 300; i++) System.out.print(new String("|")); } } }
🚋 출처
자바의 정석 책 & 유튜브