본문 바로가기

java,jsp,spring/java

java 스레드

스레드 (Thread)

스레드와 멀티스레딩

  • 스레드 : JVM에 의해 스케쥴되는 실행 단위의 코드 블럭
  • 자바의 멀티태스킹 : 멀티스레딩, 응용프로그램 > 스레드가 한개 이상 구성되어 있음
  • 멀티스레딩 효과 : 시간 지연을 줄임

[멀티스레딩 예시 코드]

class ThreadEx1 extends Thread {
	@Override
	public void run() {
		for (int i = 0; i < 5; i++) {
			System.out.println("i: "+i);
		}
	}
}
public class ThreadEx {
	public static void main(String[] args) {
		ThreadEx1 t1 = new ThreadEx1();
//		Thread t2 = new Thread(new ThreadEx2());
		Runnable r = new ThreadEx2();
		Thread t2 = new Thread(r);

		t1.start();
		t2.start();
	}
}
class ThreadEx2 implements Runnable {
	@Override
	public void run() {
		for (int j = 10; j < 15; j++) {
			System.out.println("j: "+j);
		}
	}
}

// 실행할때 마다 결과가 다르게 나옴
  • 자바 스레드와 JVM

  • 스레드 만들기 주의사항 : run() 메소드가 종료하면 스레드는 종료 한번 종료한 스레드는 다시 시작시킬 수 없음
  • java.lang.Thread 클래스
    1. 스레드 클래스 작성
    2. 스레드 코드 작성 : run() 메소드 오버라이딩
    3. 스레드 객체 생성
    4. 스레드 시작 : start() 메소드 호출
TimerThread th = new TimerThread(); // 객체 생성 방법
  • public class TimerThread extends Thread{
    	int n=0;
    	
    	@Override
    	public void run() {
    		while (true) {
    			System.out.println(n);
    			n++;
    			try {
    				sleep(1000); // 시간 지연 ms 단위
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			} 
    		}
    	}
    }
    
    public class TestThread {
    	public static void main(String[] args) {
    		TimerThread th = new TimerThread();
    		th.start();
    	}
    }
    
  • java.lang.Runnable 인터페이스
    1. 스레드 클래스 작성
    2. 스레드 코드 작성 : run() 메소드 구현
    3. 스레드 객체 생성
    4. 스레드 시작 : start() 메소드 호출
Thread th = new Thread(new TimerRunnable()); // 객체 생성 방법
  • public class TimerRunnable implements Runnable{
    	int n=0;
    
    	@Override
    	public void run() {
    		while (true) {
    			System.out.println(n);
    			n++;
    			try {
    				Thread.sleep(1000);
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    	}
    }
    
    public class TestRunnable {
    	public static void main(String[] args) {
    		Thread th = new Thread(new TimerRunnable());
    		th.start();
    	}
    }
    

스레드 상태

  • 스레드 주요 정보

public class ThreadMainEx {
	public static void main(String[] args) {
		long id = Thread.currentThread().getId();
		String name = Thread.currentThread().getName();
		int priority = Thread.currentThread().getPriority();
		Thread.State s = Thread.currentThread().getState();
		
		System.out.println("현재 쓰레드 ID = "+id);
		System.out.println("현재 쓰레드 이름 = "+name);
		System.out.println("현재 쓰레드 우선순위 값 = "+priority);
		System.out.println("현재 쓰레드 상태 = "+s);
	}
}
  • 스레드 우선순위
    • 10이 최상위 우선순위
    • setPriority(int priority)/getPriority() 메소드 사용
    • main()을 실행시 main 스레드가 생성되어 실행
  • 스레드 상태
    • NEW : 생성
    • RUNNABLE : 실행
    • WATING : wait() 호출
    • TIMED_WATING : sleep(n) 호출
    • BLOCK : I/O 작업을 요청하면 JVM이 자동으로 BLOCK 상태로 만듬
    • TERMINATED : 종료

notify() : 일시 정지 상태에 있는 다른 스레드를 실행 대기 상태로 만듬
notifyAll() : 대기중인 스레드 모두 작동

'java,jsp,spring > java' 카테고리의 다른 글

java 네트워크  (0) 2022.08.08
java 입,출력 스트림  (0) 2022.08.06
java 제네릭, 컬렉션  (0) 2022.08.03
java 기타 클래스  (0) 2022.08.01
java 스레드, 메모리 사용 영역  (1) 2022.08.01