본문 바로가기

Java

15 -2장 쓰레드의 생성 및 실행

쓰레드 생성방법 

 - 방법 1 . Thread 클래스를 상속받아 run() 메서드를 오버라이딩하는 것 

   -> run() 메서드의 내부에서 작성된 내용이 바로 CPU를 독립적으로 사용하면서 동시에 실행되는 것 

 

 - 방법 2.1 Runnable  인터페이스를 구현한 Runnable 객체를 생성

   -> 이 인터페이스는  추상메서드로 run() 메서드를 갖고 있음 

   -> 인터페이스 객체 생성과정에서 run() 메서드를 구현해야 함

 - 방법 2.2 Thread 객체를 생성할때 1단계에서 생성한 Runnable 객체를 생성자로 전달 

 

- 생성한 쓰레드를 실행하는 방법은 객체를 어떤 방법으로 실행했든 Thread 객체 내의 start() 메서드를 호출하는 것

- run()의 내용을 실행하기 위해서는 반드시 start() 메서드를 호출해야함

- start() 메서드로 한 번 실행된 Thread객체는 재사용할 수 없음

 

1. 쓰레드 생성 및 실행 방법

 

 1) Thread 클래스를 상속받아 run() 메서드 재정의 

 

 step1. 클래스 정의 

 

 - Thread 클래스를 상속받아 run() 메서드를 오버라이딩한 클래스(또는 익명 이너 클래스) 정의 

 - 쓰레드에서 작업할 내용은 run() 메서드 안에 작성 

class MyThread extends Thread {
	@Override
    public void run() [
    	//쓰레드 작업 내용
    }
}

   

step2. 객체 생성

 

 - 생성한 Thread 클래스의 기본 생성자를 이용해 객체 생성 

Thread myThread = new MyThread();
또는
MyThread myThread = new MyThread();

 

step3. 쓰레드 실행 

 

 - start() 메서드를 이용해 쓰레드 실행 

 - start() = 새로운 쓰레드 생성/추가하기 위한 모든 준비 + 새로운 쓰레드 위에 run() 실행 

myThread.start()

 

방법 1. 2개의 쓰레드 활용(main, SMIFileThread)

package StartThread;

//Thread 클래스를 상속해 클래스를 생성한 후 쓰레드 2개 생성

class SMIFileThread extends Thread {
	//override
	public void run() {
		//자막 번호 하나~다섯
		String[] strArray = {"하나","둘","셋","넷","다섯"};
		try {Thread.sleep(10);} catch(InterruptedException e) {}
		//자막 번호 출력
		for(int i=0; i < strArray.length; i++) {
			System.out.println("-(자막 번호)" + strArray[i]);
			try {Thread.sleep(200);}catch(InterruptedException e) {}
		}
	}
}
public class StartThread {
	public static void main(String[] args) {
		
		//SMIFileThread 객체 생성 및 시작 
		Thread smiFileThread = new SMIFileThread();
		smiFileThread.start();
		
		//비디오 프레임 번호 1~5
		int[] intArray = {1,2,3,4,5};
		
		//비디오 프레임 번호 출력
		for(int i =0; i < intArray.length; i++) {
			System.out.println("(비디오 프레임)"+intArray[i]);
			try {Thread.sleep(200);}catch(InterruptedException e) {}
		}
	}
}

 - 멀티 쓰레드는 독립적으로 실행되기 때문에 먼저 start() 메서드로 호출됐다 하더라도 나중에 실행된 쓰레드보다 늦게 실행될 수 있다

- 자막 번호가 항상 비디오 번호 뒤에 나오도록 자막 쓰레드에 Thread.sleep(10)을 추가해 0.01초 늦게 출력되도록 함 

방법 2. 3개의 쓰레드 활용 (main, SMIFileThread, VideoFileThread)

package StartThread;

//Thread 클래스를 상속해 클래스를 생성한 후 쓰레드 3개 생성 

class SMIFileThread extends Thread {
	//override
	public void run() {
		//자막 번호 하나~다섯
		String[] strArray = {"하나","둘","셋","넷","다섯"};
		try {Thread.sleep(10);} catch(InterruptedException e) {}
		
		//자막 번호 출력
		for(int i=0; i < strArray.length; i++) {
			System.out.println("-(자막 번호)" + strArray[i]);
			try {Thread.sleep(200);}catch(InterruptedException e) {}
		}
	}
}

class VideoFileThread extends Thread {
	//Override
	public void run() {
		//비디오 프레임 번호 1~5
		int[] intArray = {1,2,3,4,5};
				
		//비디오 프레임 번호 출력
		for(int i =0; i < intArray.length; i++) {
			System.out.println("(비디오 프레임)"+intArray[i]);
			try {Thread.sleep(200);}catch(InterruptedException e) {}
	}
	}
}

public class StartThread {
	public static void main(String[] args) {
		
		//SMIFileThread 객체 생성 및 시작 
		Thread smiFileThread = new SMIFileThread();
		smiFileThread.start();
		
		//VideoFileThread 객체 생성 및 시작
		Thread videoFileThread = new VideoFileThread();
		videoFileThread.start();		
	}
}

 

 

2) Runnable 인터페이스 구현 객체를 생성한 후 Thread 생성자로 Runnable 객체 전달

 

step 1. 클래스 정의 

 - Runnable 인터페이스를 구현한 클래스 정의 ( 추상 메서드 run() 구현)

 - run() 추상 메서드를 구현하면서 여기에 쓰레드의 작업 내용을 작성

class MyRunnable implements Runnable {
	//override
    public void run() {
    	//쓰레드 작업 내용
    }
}

 

step 2. 객체 생성 

 

 - 정의한 클래스를 이용해 Runnable 객체 생성 

 - Runnable 객체의 내부에는 start() 메서드가 존재하지 않기 때문에 start()를 갖고 있는 Thread 객체를 생성해야함

 - 구현한 run() 메서드 자체에는 Runnable 객체가 갖고 있으므로 Thread 객체를 생성할 때 Runnable 객체를 생성자의 매개변수로 넘겨 준다.

 -Thread 객체 내부의 run() 메서드는 생성자 매개변수로 넘어온 Runnable 객체 내부의 run()으로 대체 된다.

Runnable r = new MyRunnable();
또는 
MyRunnable r = new MyRunnable();

Thread myThread = new Thread(r);

 

step 3. 쓰레드 실행

 

 - Thread 객체의 start()를 호출해 쓰레드를 실행 

myThread.start();

 

방법 1. 2개의 쓰레드를 활용 (main, SMIFileThread)

package StartThread;

//Runnable 인터페이스를 상속해 클래스를 생성한 후 쓰레드 2개 생성

class SMIFileRunnable implements Runnable {
	//override
	public void run() {
		//자막 번호 하나~다섯
		String[] strArray = {"하나","둘","셋","넷","다섯"};
		try {Thread.sleep(10);} catch(InterruptedException e) {}
		
		//자막 번호 출력
		for(int i=0; i < strArray.length; i++) {
			System.out.println("-(자막 번호)" + strArray[i]);
			try {Thread.sleep(200);}catch(InterruptedException e) {}
		}
	}
}



public class StartThread {
	public static void main(String[] args) {
		//SMIRunnable 객체 생성 
		Runnable smiFileRunnable = new SMIFileRunnable();
		//smiFileRunnable.start(); Runnable 객체에는 start() 메서드가 없어 오류 발생
		Thread thread = new Thread(smiFileRunnable);
		thread.start();
		
		//비디오 프레임 번호 1~5
		int[] intArray = {1,2,3,4,5};
		
		//비디오 프레임 번호 출력 
		for(int i =0; i < intArray.length; i++) {
			System.out.println("(비디오 프레임)"+intArray[i]);
			try {Thread.sleep(200);}catch(InterruptedException e) {}
		}
	}
}

 

 

방법 2. 3개의 쓰레드 활용 (main, SMIFileThread, VideoFileThread)

 - SMIFileRunnable = 자막 번호를 출력하는 객체 

 - VideoFileRunnable = 비디오 프레임 번호를 출력하는 객체 

 - main 쓰레드에서는 이들 2개의 객체를 생성자로 넘겨받아 쓰레드를 생성하고 실행하는 역할 수행

package StartThread;

//Runnable 인터페이스를 상속해 클래스를 생성한 후 쓰레드 2개 생성

class SMIFileRunnable implements Runnable {
	//override
	public void run() {
		//자막 번호 하나~다섯
		String[] strArray = {"하나","둘","셋","넷","다섯"};
		try {Thread.sleep(10);} catch(InterruptedException e) {}
		
		//자막 번호 출력
		for(int i=0; i < strArray.length; i++) {
			System.out.println("-(자막 번호)" + strArray[i]);
			try {Thread.sleep(200);}catch(InterruptedException e) {}
		}
	}
}

class VideoFileRunnable implements Runnable {
	//Override
	public void run() {
		//비디오 프레임 번호 1~5
		int[] intArray = {1,2,3,4,5};
				
		//비디오 프레임 번호 출력 
		for(int i =0; i < intArray.length; i++) {
			System.out.println("(비디오 프레임)"+intArray[i]);
			try {Thread.sleep(200);}catch(InterruptedException e) {}
		}
	}
}

public class StartThread {
	public static void main(String[] args) {
		//SMIRunnable 객체 생성 
		Runnable smiFileRunnable = new SMIFileRunnable();
		//smiFileRunnable.start(); Runnable 객체에는 start() 메서드가 없어 오류 발생
		Thread thread1 = new Thread(smiFileRunnable);
		thread1.start();
		
		//VideoFileRunnable 객체 생성
		Runnable videoFileRunnable = new VideoFileRunnable();
		//videoFileRunnable.start(); Runnable 객체에는 start() 메서드가 없어 오류 발생
		Thread thread2 = new Thread(videoFileRunnable);
		thread2.start();
	
		}
	}

 

방법 3. 이너 클래스를 활용한 쓰레드 객체 생성 및 실행 

 - 별도의 클래스를 정의하지 않고, 익명 이너 클래스를 문법을 사용해 Runnable 인터페이스 객체를 생성

 - 실행되는 쓰레드는 main 쓰레드와 2개의 이름이 없는 익명 이너 클래스 

 

package StartThread;

public class StartThread {
	public static void main(String[] args) {
		
		//자막 번호를 출력하는 쓰레드의 익명 이너 클래스 정의 
		Thread thread1 = new Thread(new Runnable() {
			//override
			public void run() {
				//자막 번호 하나~다섯
				String[] strArray = {"하나","둘","셋","넷","다섯"};
				try {Thread.sleep(10);} catch(InterruptedException e) {}
				
				//자막 번호 출력
				for(int i=0; i<strArray.length; i++) {
					System.out.println("-(자막번호)"+strArray[i]);
					try {Thread.sleep(200);} catch(InterruptedException e) {}
				}
			}
		});
		
		//비디오 프레임 번호를 출력하는 쓰레드의 익명 이너 클래스의 정의 
		Thread thread2 = new Thread(new Runnable() {
			//override
			public void run() {
				//비디오 프레임 번호 1~5
				int[] intArray = {1,2,3,4,5};
				
				//비디오 프레임 번호 출력
				for(int i =0;i<intArray.length; i++) {
					System.out.println("(비디오 프레임)"+intArray[i]);
					try {Thread.sleep(200);}catch(InterruptedException e) {}
				}
			}
		});
		
		//Thread 실행
		thread1.start();
		thread2.start();
	
		}
	}

 

 

'Java' 카테고리의 다른 글

15 - 4 장 쓰레드의 동기화  (0) 2023.06.14
15 - 3장 쓰레드의 속성  (0) 2023.06.14
15 - 1장 프로그램, 프로세스, 쓰레드  (0) 2023.06.13
14 - 4장 사용자 정의 예외 클래스  (0) 2023.06.13
14 - 3장 예외 전가  (0) 2023.06.13