JAVA | 멀티 스레드 2

    JAVA / / 2020. 11. 18. 12:46

    데몬 스레드 (Deamon Thread)

    주 스레드가 작업에 보조적인 역할을 수행하는 스레드(종속적 스레드)

    주 스레드가 종료되면 데몬 스레드는 강제적으로 자동 종료됨

     

    스레드 그룹 생성

    부모 그룹 지정하지 않으면 현재 스레드 속한 그룹의 하위 그룹으로 생성

    interrupt() 모든 스레드 중지시키는 기능

     

    데몬스레드 예제

    package kr.co.kihd.daemon;
    
    public class AutoSaveThread extends Thread{
    	
    	public void save() {
    		System.out.println("작업 내용을 저장함.");
    	}
    
    	@Override
    	public void run() {
    		
    		//1초 단위로 save()메서드 호출
    		while(true) {
    			try {
    				Thread.sleep(1000);
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    			this.save();
    		}
    	}
    }
    
    package kr.co.kihd.daemon;
    
    import kr.co.kihd.threadgroup.AutoSaveThread;
    
    public class DaemonTest {
    
    	public static void main(String[] args) {
    		
    		AutoSaveThread autoSaveThread = new AutoSaveThread();
    		//daemon설정 (필히, start() 호출전에 설정을 해야한다.)
    		autoSaveThread.setDaemon(true);
    		autoSaveThread.start();
    		
    		/*
    		 * 메인스레드가 5초동안 정지하면, daemon스레드인 autoSaveThread가
    		 * 실행되고, 메인스레드가 종료되면 더 이상 autoSaveThread실행이 
    		 * 안된다는 것을 알수 있다(종속적 관계이기 때문)
    		 */
    		
    		try {
    			Thread.sleep(5000);
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    		System.out.println("메인스레드 종료됨");
    
    	}
    
    }
    

    스레드그룹 예제

    package kr.co.kihd.threadgroup;
    
    public class AutoSaveThread extends Thread{
    	
    	public void save() {
    		System.out.println("작업 내용을 저장함.");
    	}
    
    	@Override
    	public void run() {
    		
    		//1초 단위로 save()메서드 호출
    		while(true) {
    			try {
    				Thread.sleep(1000);
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    			this.save();
    		}
    	}
    }
    
    package kr.co.kihd.threadgroup;
    
    import java.util.Map;
    import java.util.Set;
    
    public class ThreadGruopTest {
    
    //	데몬 스레드는 다른 일반 스레드의 작업을 돕는 보조적인 역할을 수행하는
    //	스레드입니다. 일반 스레드가 모두 종료되면 데몬 쓰레드는 강제적으로 자동 종료됩니다.
    
    	public static void main(String[] args) {
    		AutoSaveThread autoSaveThread = new AutoSaveThread();
    		autoSaveThread.setName("AutoSaveThread");
    		autoSaveThread.setDaemon(true);
    		autoSaveThread.start();
    		
    		//Map컬렉션은 <키, 값> 키로 값을 찾아오는 자료구조의 한형태,
    		//단 Map은 인터페이스이다.
    		Map<Thread,StackTraceElement[]> map = Thread.getAllStackTraces();
    		
    		//Map의 키값만 Set컬렉션 형태로 가져온다. (Set은 인터페이스이며,)
    		//구슬주머니와 같은 형태의 자료구조이다.
    		Set<Thread> threads = map.keySet();
    		
    		for(Thread thread : threads) {
    			System.out.println("스레드 이름 : " + thread.getName()
    						+ ( (thread.isDaemon() ? "(데몬스레드)" : "(주스레드)")) );
    			//스레드그룹 출력
    			System.out.println("\t 소속 그룹 : " + thread.getThreadGroup().getName());
    			System.out.println();
    		}
    	}
    }
    

    스레드 이름 : Common-Cleaner(데몬스레드)
     소속 그룹 : InnocuousThreadGroup

    스레드 이름 : Reference Handler(데몬스레드)
     소속 그룹 : system

    스레드 이름 : Finalizer(데몬스레드)
     소속 그룹 : system

    스레드 이름 : Signal Dispatcher(데몬스레드)
     소속 그룹 : system

    스레드 이름 : Attach Listener(데몬스레드)
     소속 그룹 : system

    스레드 이름 : AutoSaveThread(데몬스레드)
     소속 그룹 : main

    스레드 이름 : main(주스레드)
     소속 그룹 : main


    인터럽트 사용

    package kr.co.kihd.threadgroup2;
    //스레드 그룹이름 현재스레드 이름 출력하는 코드 끝나는 조건을 인터럽발생되면 브레이크
    public class WorkThread extends Thread{
    	
    	public WorkThread(ThreadGroup threadGroup, String threadname) {
    		super(threadGroup, threadname); //조상클래스의 매개변수가 있는 생성자를 호출
    	}
    	@Override
    	public void run() {
    		//현재 실행되고 있는 스레드 그룹을 얻음
    		ThreadGroup mainGruop = Thread.currentThread().getThreadGroup();
    		String str = mainGruop.getName();
    		System.out.println("스레드 그룹 이름 : " + str);
    		
    		
    		while(true) {
    			//스레드 너무 빨리실행되어 sleep() 추가
    			try {
    				Thread.sleep(1000);
    			} catch (InterruptedException e) {
    				System.out.println(this.getName() + " 인터럽트 호출됨!");
    				break;
    			}
    		}
    		System.out.println(this.getName() + "종료됨");
    	}
    	
    }
    
    package kr.co.kihd.threadgroup2;
    
    public class ThreadGroupTest {
    	
    	public static void main(String[] args) {
    		//현재 실행되고 있는 스레드 그룹 얻어옴
    		ThreadGroup mainGroup = Thread.currentThread().getThreadGroup();
    		String threadGroup = mainGroup.getName();
    		System.out.println(threadGroup);
    		
    		//myGroup은 main그룹의 하위 그룹으로 만들어짐
    		ThreadGroup myGroup = new ThreadGroup("myGroup");
    		WorkThread workThreadA = new WorkThread(myGroup, "workThreadA");
    		WorkThread workThreadB = new WorkThread(myGroup, "workThreadB");
    		
    		workThreadA.start();
    		workThreadB.start();
    		
    		System.out.println("[메인 스레드 그룹의 list()메서드 호출후 출력 내용]");
    		ThreadGroup mainGroup2 = Thread.currentThread().getThreadGroup();
    		mainGroup2.list();
    		
    		try {
    			Thread.sleep(3000);
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    		myGroup.interrupt();
    	}
    	
    }
    
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기
    loading