✔ 스레드
- 프로세스(process)
1) 실행중인 하나의 애플리케이션
2) 애플리케이션이 실행되면 운영체제로 부터 실행에 필요한 메모리 할당받아 코드를 실행한다
3) 멀티 프로세스 역시 가능하다
- 스레드
1) 한가지 작업을 실행하기 위해 순차적으로 실행할 코드를 이어놓은 것
2) 하나의 스레드는 하나의 코드 실행 이름
- 멀티 스레드
1) 하나의 프로세스로 두가지 이상의 작업을 처리하는 것
2) 데이터 분할하여 병렬로 처리하거나 다수 클라이언트 요청 처리하는 서버 개발하는 등의 용도
3) 한 스레드가 예외 발생시킬 경우 프로세스 자체가 종료될 수 있다
- 메인스레드
1) 모든 자바 애플리케이션은 메인 스레드가 main()메소드 실행하면서 시작된다
2) main() 메소드의 첫 코드부터 아래로 순차적으로 실행한다
3) 필요에 따라 작업 스레드를 만들어 병렬로 코드 실행 가능하다
4) 멀티 스레드 애플리케이션에서는 실행 중인 스레드 하나라도 있으면 프로세스는 종료되지 않는다
- 작업 스레드
1) 멀티 스레드로 실행하는 애플리케이션 개발하려면 몇개의 작업을 병렬로 실행할지 우선 결정 한 뒤 각 잡업별로 스레드 생성해야 한다
2) 작업 스레드 역시 객체로 생성되므로 클래스가 필요하다
- 스래드 클래스 상속하여 하위 클래스 만들어 사용할 수 있다
- 데몬 스레드
1) 주 스레드의 작업을 돕는 보조적 역할을 하는 스레드
2) 일반스레드가 모두 종료되는 자동적으로 종료 된다
💡 메인스레드만 이용한 경우
- 코드
package ThisJavaThread; import java.awt.Toolkit; public class BeepPrintEx1 { public static void main(String[] args) { // 메인 스레드만 이용한 경우 // Toolkit 객체 생성 Toolkit toolkit = Toolkit.getDefaultToolkit(); for(int i=0; i<5; i++) { // 비프음 발생 toolkit.beep(); // Thread.sleep(500) : 0.5초간 일시정지 try { Thread.sleep(500);} catch(Exception e) {} } for(int i=0; i<5; i++) { System.out.println("띵"); // Thread.sleep(500) : 0.5초간 일시정지 try {Thread.sleep(500); } catch(Exception e) {} } } }
💡 비프음을 들려주는 작업 정의 – Runnable 구현 클래스
- 코드
package ThisJavaThread; import java.awt.Toolkit; public class BeepTask implements Runnable { // 비프음을 들려주는 작업 정의 – Runnable 구현 클래스 public void run() { // 여기부터 Toolkit toolkit = Toolkit.getDefaultToolkit(); for(int i=0; i<5; i++) { toolkit.beep(); try {Thread.sleep(500); } catch(Exception e) {} }// 여기까지 스레드 실행내용 } }
💡 비프음 - 메인 스레드와 작업 스레드가 동시에 실행
- 코드
package ThisJavaThread; import java.awt.Toolkit; public class BeepPrintex2 { public static void main(String[] args) { // 비프음 - 메인 스레드와 작업 스레드가 동시에 실행 Runnable beepTask = new BeepTask(); Thread thread = new Thread(beepTask); thread.start(); // thread.start(); : /* public void run() { // 여기부터 Toolkit toolkit = Toolkit.getDefaultToolkit(); for(int i=0; i<5; i++) { toolkit.beep(); try {Thread.sleep(500); } catch(Exception e) {} }// 여기까지 스레드 실행내용 */ for(int i=0; i<5; i++) { System.out.println("띵"); try { Thread.sleep(500); } catch (Exception e) {} } } }
💡 비프음을 들려주는 스레드
- 코드
package ThisJavaThread; import java.awt.Toolkit; // extends Thread 작성하기 public class BeepThread extends Thread { // 비프음을 들려주는 스레드 @Override public void run() { Toolkit toolkit = Toolkit.getDefaultToolkit(); for(int i=0; i<5; i++) { toolkit.beep(); try {Thread.sleep(500); } catch(Exception e) {} } } }
💡 메인스레드와 작업 스레드가 동시에 실행
- 코드
package ThisJavaThread; public class BeepPrintEx3 { public static void main(String[] args) { // 메인스레드와 작업 스레드가 동시에 실행 Thread thread = new BeepThread(); thread.start(); for(int i=0; i<5; i++) { System.out.println("띵"); try {Thread.sleep(500); } catch(Exception e) {} } } }
💡 메인 스레드 이름 출력 및 UserThread 생성 및 시작
- 코드
package ThisJavaThread; public class ThreadNameEx { public static void main(String[] args) { // 메인 스레드 이름 출력 및 UserThread 생성 및 시작 // .currentThread(); : 이 코드를 실행하는 스레드 객체 생성 Thread mainThread = Thread.currentThread(); System.out.println("프로그램 시작 스레드 이름 : " + mainThread.getName()); // threadA 생성 ThreadA threadA = new ThreadA(); System.out.println("작업 스레드 이름 : " + threadA.getName()); // threadA 시작 threadA.start(); // threadB 생성 ThreadB threadB = new ThreadB(); System.out.println("작업 스레드 이름 : " + threadB.getName()); // threadB 시작 threadB.start(); } }
💡 ThreadA 클래스
- 코드
package ThisJavaThread; public class ThreadA extends Thread{ public ThreadA() { // 스레드 이름 설정 setName("ThreadA"); } public void run() { for(int i=0; i<2; i++) { // getName() : 스레드 이름 얻기 System.out.println(getName() + "가 출력한 내용"); } } }
💡 ThreadB 클래스
- 코드
package ThisJavaThread; public class ThreadB extends Thread{ public ThreadB() { // 스레드 이름 설정 setName("ThreadB"); } public void run() { for(int i=0; i<2; i++) { // getName() : 스레드 이름 얻기 System.out.println(getName() + "가 출력한 내용"); } } }