Java

자바 Thread

ryeonng 2024. 5. 2. 17:32

Thread란?

  • process란? 저장되어 있는 프로그램이 실행되면 OS로 부터 메모리를 할당받아 프로세스 상태가 된다.
  • 하나의 프로세스는 하나 이상의 thread를 가지게 되고, 실제 작업을 수행하는 단위는 thread이다.

 

 

 

 

 


 

Thread를 추가로 만들어 사용하는 방법

1. 첫 번째 방법은 Thread 클래스를 상속하여 만들 수 있다.

 

package useful.ch05;
/**
 * 쓰레드를 추가하는 방법 - 상속을 활용할 수 있다.
 * Thread --> Runnable --> run()
 */
public class MyThread extends Thread { // 다형성 적용 : MyThread -> Thread 로 볼 수 있다.
	
	
	// 우리가 정의한 클래스에서 run() 메서드를 오버라이드 사용해 재정의할 수 있다.
	// 쓰레드를 사용할 때 알아야 하는 필수 개념 ! (※암기하자)
	// 쓰레드가 가지고 있는 메서드인 start()를 호출하면,
	// 약속으로 run() 메서드가 호출되어 동작하도록 만들어져 있다.
	@Override
	public void run() {
		// 우리가 동작 시키고자 하는 일을 정의해서 코드를 설계할 수 있다.
		// 임무 -> 반복문 200 번을 수행하라.
		for (int i = 0; i < 200; i++) {
			System.out.println(i + ", "); // 줄 바꾸지 않고 옆으로 프린트 하라.
			try {
				Thread.sleep(500); // 500 = 0.5초 // 1000 = 1초 : 쉬었다가 실행
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

} // end of class

 

package useful.ch05;

public class MyThreadMainTest {

	// 기본적으로 메인 작업자 하나를 가지고 있다. = 메인 쓰레드 라고 한다.
	public static void main(String[] args) {

		System.out.println(Thread.currentThread());
		
		// 필요하다면 추가 작업자를 사용할 수 있다.
		MyThread th1 = new MyThread();
		th1.start(); // start가 호출되면 run() 메서드가 동작되도록 약속 되어 있다.
		System.out.println("--------------------");
		
		// 필요하다면, 추가 작업자를 더 만들수 있다.
		MyThread th2 = new MyThread();
		th2.start();
		
		// 메인쓰레드 + th1 + th2 : 3개의 쓰레드 존재 : 멀티 쓰레딩
		
	} // end of main

} // end of class

 


package useful.ch05;

// How , Why 생각해보기
public class Worker extends Thread {

	private String name;
	
	public Worker(String name) {
		this.name = name;
	}
	
	// 약속된 부분 --> run() 메서드를 정의하면 된다.
	@Override
	public void run() {
		for (int i = 0; i < 50; i++) {
			System.out.println("worker : " + name + " : " + i);
			try {
				Thread.sleep(200); 
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
}

 

package useful.ch05;

public class WorkerMainTest {

	// 메인 작업자
	public static void main(String[] args) {
		System.out.println("------------------ main 쓰레드 시작 ------------------");
		System.out.println(Thread.currentThread()); //현재쓰레드 작성
		
		// 작업자 하나 만들어 내기
		Worker worker1 = new Worker("워커1"); // 하위쓰레드(워커1)의 생성은 메인쓰레드가 했다.
		// 명령어를 통해 워커1에게 네가 위임 받은 일을 시작하라 명령.
		worker1.start(); // 메인 쓰레드가 내린 명령어
		
		System.out.println("------------------- main 쓰레드 종료 ------------------");
	}

}

 

2. 두 번째 방법은 Runnable 인터페이스를 구현 해 만들 수 있다.

 

package useful.ch05;
/**
 * 쓰레드를 만드는 두 번째 방법
 * Runnable 인터페이스를 활용하는 방법
 */

public class MyThread2 implements Runnable{ // 다중 상속 불가 : 이미 다른 것을 상속했다면, runnable 사용

	
	// Thread 클래스에서 start 메서드가 호출되면
	// 동작하는 부분이라 약속 되어 있다.
	@Override
	public void run() {
		int i = 0;
		while(i < 10) {
			System.out.println("i : " + i);
			i++;
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	} 

	
	
}

 

package useful.ch05;

public class MyThread2MainTest {

	// 메인 작업자
	public static void main(String[] args) {

		System.out.println(" main start ");

		// * 문제
		// MyThread2를 메모리에 올리고
		// 그 안에 정의된 run() 메서드를 호출하라.
		// 힌트 ) Thread 문서를 반드시 확인하라.


		MyThread2 mythread2 = new MyThread2();
		//myThread2.run(); 는 일반 메서드를 호출하는 것 뿐임!!!
		
		// 새로운 작업자를 생성해서 위임 시킬때는, Thread 안에 있는  ★ start() ★ 메서드를 호출해야 한다.
		// ※ 암기 ! 
		
		Thread thread1 = new Thread(mythread2); // mythread2 : runnable 데이터 타입 -> runnable 데이터 타입을 호출함.
		thread1.start();
		
		// 결국 다른 작업자에게 일을 위임하려면, 쓰레드에 start()를 호출해야 한다.

		System.out.println("----------- end main thread -----------");

	} // end of main

}

 


 

Thread 실행 시, Thread 상태라는 개념

Thread Status

 

 

Thread란

프로세스 내 에서 실제로 작업을 수행하는 단위.
모든 자바 프로그램은 메인 스레드에서 시작되며, 사용자는 추가적인 스레드를 생성할 수 있다.
각 스레드는 독립적으로 실행되며, 자신만의 호출 스택을 가진다. (각 쓰레드의 스택 영역은 서로 격리되어 있다)
프로세스 내의 모든 스레드는 같은 Heap 메모리 공간과 다른 자원을 공유할 수 있다.

 

'Java' 카테고리의 다른 글

자료구조 개론  (2) 2024.05.09
자바 multi-threading  (5) 2024.05.03
Swing (이미지 겹치기)  (0) 2024.05.02
Exception(예외처리)  (0) 2024.04.30
String, StringBuffer 클래스  (1) 2024.04.29