YJ의 새벽

JAVA (쓰레드 thread) 본문

SelfStudy/JAVA

JAVA (쓰레드 thread)

YJDawn 2023. 2. 7. 01:02

 

 

--프로세스 : 실행중인 프로그램, 자원 (메모리,cpu ... ) 과 쓰레드로 구성.

--쓰레드 : 프로세스 내에서 실제 작업을 수행.

                모든 프로세스는 하나 이상의 쓰레드를 가지고있다.

 

멀티쓰레드의 장점 : 시스템자원을 효율적으로 사용할수있음.

                                 사용자에대한 응답성이 향상.

                                 작업이 분리되어 코드가 간결.

멀티쓰레드의 단점 : 동기화(synchronization)에 주의 해야함.

                                 교착상태가 발생하지않도록 주의.

                                 프로그래밍 할 때 고려해야 할 사항들이 많다.

 

쓰레드 구현과 실행.

 

-- 자바는 단일 상속이므로, Runnable 을 구현하는것이 좀더 실용적이다.

 

 

Thread를 상속 받을때.
Runnable 인터페이스 구현할때.

 

 

 

 

    EX ))) 쓰레드를 실행해보자.

-- 쓰레드를 실행시키면 (start()) 바로 실행되는게 아니고,

   OS 스케줄러가 실행순서를 결정한다. ( OS에 의존 )

class ThreadEx1 extends Thread{           //extends Thread
	@Override
	public void run() {
		for( int i=0; i < 10 ;i++ ) {
			System.out.println(getName());  //Thread의 getName() 호출
		}
	}
}
class ThreadEx2 implements Runnable{      // implements Runnable
	@Override
	public void run() {
		for( int i=0; i< 10 ;i++ ) {
			System.out.println( Thread.currentThread().getName() ); //현재실행중인 Thread호출
		}
	}
}
public class Example {
	public static void main(String[] args) {
		
		ThreadEx1 t1 = new ThreadEx1();
		
		Runnable r = new ThreadEx2();
		Thread t2 = new Thread(r);   //생성자 Thread (Runnable target)
     //Thread t2 = new Thread( new ThreadEx2());
		
		t1.start();
		t2.start();
	}		
}

 

 

 

 

main 쓰레드

 

--main메서드의 코드를 수행하는 쓰레드.

-- 사용자쓰레드와 데몬(보조) 쓰레드 두종류가 있다.

-- 실행중인 사용자 쓰레드가 하나도 없을때 프로그램은 종료된다.

 

 

싱글쓰레드
멀티쓰레드

 

 

쓰레드의 I/O 블락킹

 

--입출력시 작업중단.

--사용자로부터 입력을 받는구간에서는 아무일도 하지 않는다 . (싱글쓰레드)

    ( 멀티쓰레드를 사용하면 작업이 진행된다. )

 

 

    EX )))  싱글쓰레드 진행시

입력하기 전까지 프로그램이 멈춘다.

import javax.swing.JOptionPane;

public class Example {
	public static void main(String[] args) {
		String input = JOptionPane.showInputDialog("아무값 입력하세요");
		System.out.println("입력한 값은 : "+ input);
		                                     // 입력하기 전까지 멈춰있음.
		for(int i=10 ; i > 0 ; i--) {
			System.out.println(i);
			try {
				Thread.sleep(1000);     // 1초씩 쉬었다가 진행
			} catch(Exception e) {				
			}
		}
	}		
}

 

 

 

    EX )))) 멀티쓰레드 진행시 .

입력하지않아도 다른쓰레드가 프로그램을 진행한다.

import javax.swing.JOptionPane;

class ThreadEx extends Thread {
	@Override
	public void run() {
		for(int i=10 ; i > 0 ; i--) {
			System.out.println(i);
			try {
				Thread.sleep(1000);     // 1초씩 쉬었다가 진행
			} catch(Exception e) {				
			}
		}
	}
}   //end of ThreadEx
public class Example {
	public static void main(String[] args) {
		
		ThreadEx thread = new ThreadEx();
		thread.start();
		
		String input = JOptionPane.showInputDialog("아무값 입력하세요");
		System.out.println("입력한 값은 : "+ input); 
		                                       // 값을 입력하지않아도 카운트 진행.
	}		
}

 

 

 

 

 

  • 쓰레드의 우선순위

--작업의 중요도에 따라 쓰레드의 우선순위를 다르게 하여

  특정 쓰레드가 더 많은 작업시간을 갖게 할수 있다.

--JAVA 에서는 1~10 까지 범위를 잡을수 있다.

   윈도우 OS 에는 32단계가 있기때문에, 

   우리가 주는 1~10 범위는 OS에 부탁하는 참고용 .

--우선순위가 높은 쓰레드가 더 많은 할당량을 같는다.

 

    EX ))) 쓰레드의 우선순위.

class ThreadEx extends Thread {
	@Override
	public void run() {
		for( int i=0; i < 300; i++ ) {
			System.out.print("-");
			for(int x=0; x < 10000000; x++);
		}
	}
}   //end of ThreadEx   쓰레드1 생성

class ThreadEx2 extends Thread{
	@Override
	public void run() {
		for( int i=0; i < 300; i++ ) {
			System.out.print("|");
			for(int x=0; x < 10000000; x++);
		}
	}
}  //end of ThreadEx2   쓰레드2 생성


public class Example {
	public static void main(String[] args) {
		
		ThreadEx thread = new ThreadEx();
		ThreadEx2 thread2 = new ThreadEx2();
		
		thread2.setPriority(7);              // thread2 우선순위 7
		
		System.out.println("Priority thread(-) : "+thread.getPriority());
		System.out.println("Priority thread2(|) : "+thread2.getPriority());
		thread.start();
		thread2.start();

		                          //우선순위가 높다고 무조건이 아니라.
		                          //확률을 더 올려준다고 생각하자.
	}		
}

 

 

 

 

  • 쓰레드 그룹

--서로 관련된 쓰레드를 그룹으로 묶어서 다루기 위한 것.

--모든 쓰레드는 반드시 하나의 쓰레드 그룹에 포함되어 있어야한다.

--쓰레드 그룹을 지정하지않고 생성한 쓰레드는 main쓰레드 그룹에 속한다.

--자신을 생성한 쓰레드(부모쓰레드) 의 그룹과 우선순의를 상속받는다.

 

 

 

------쓰레드그룹의 메서드

 

 

 

 

 

 

 

 

 

 

 

 

'SelfStudy > JAVA' 카테고리의 다른 글

JAVA (쓰레드의 메서드)  (0) 2023.02.07
JAVA ( 데몬 쓰레드 )  (0) 2023.02.07
JAVA (애너테이션)  (0) 2023.02.06
JAVA (열거형)  (0) 2023.02.06
JAVA (제네릭 <?>, 형변환)  (0) 2023.02.05
Comments