Develop/JAVA

0603 JAVA 열세번째

포페PostFace 2022. 6. 3. 16:09

HashMap

HashMap에 넣을 요소는 기본 데이터 타입 뿐만 아니라
클래스를 넣을 수 있다.

Thread

메인과 동시에 돌리고 싶은 메서드가 있다면
사용하는 클래스다.

implements Runnable

위의 인터페이스를 클래스에 구현 한 뒤
run 메서드를 정의해준다.

Thread 객체명 = new Thread(관리할 클래스 객체명);
객체명.start;

.start 메서드를 통해 Runnable 인터페이스의
.run 메서드를 실행시킨다.
그러면 클래스의 메서드와 메인이 동시에 출력된다.
(원래 클래스의 메서드를 호출하면 메인의 진행이 잠시
그 자리에 멈춰있다가 메서드가 끝나고 다시 진행된다.)

extends Thread

클래스에서 Thread를 상속 받고 해당 클래스에
run메서드를 정의 해준뒤
메인에서 .start 메서드를 호출하면 동시 진행이
가능하게된다.

try {
	Thread.sleep(1000); //1000=1초
} catch (InterruptedException e) {
	e.printStackTrace();
}


Thread 클래스의 자체 메서드 sleep

long타입의 데이터를 넣을 수 있으며 1000당 1초씩
멈추었다가 진행한다. 에러가 날 수 있기 때문에
try/catch를 통해 예외처리를 반드시 해야한다.

Thread 클래스를 직접 상속 받은 경우에는
굳이 Thread를 통해 호출하지 않아도 된다.

Thread의 우선순위
순위가 1~10이라고 가정했을때 Thread의 디폴트 순위는
5위정도이다.
.setPriority( ) 를 통해 우선 순위를 바꿔줄 수 있고
괄호 안의 숫자가 커질수록 우선순위가 올라간다. 
우선순위가 올라간다고 꼭 먼저 나오는것은 아니고
먼저 나올 가능성이 올라간다고 할 수 있다.

멀티스레드

두개이상의 메서드를 Thread를 통해 
동시 진행 하는것을 말한다,

데몬 스레드 (daemon thread)
다른 일반 스레드의 작업을 돕는 보조적인 
역할을 수행하는 스레드

 

class DaemonTest extends Thread{
	public void run() {
		while(true) {
			try {
				Thread.sleep(3000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
			if(Ex10_05_데몬스레드.autoSave) {
				autoSave();
			}
		}
	}
	public void autoSave() {
		System.out.println("작업화일이 자동저장되었습니다.");
	}
}
public class Ex10_05_데몬스레드 {

	static boolean autoSave = false;
	public static void main(String[] args) {
		DaemonTest t=new DaemonTest();
		t.setDaemon(true);
		t.start();
		for(int i=1;i<=20;i++) {
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(i);
			if(i==5)
				autoSave = true;
		}
		System.out.println("프로그램을 종료합니다.");
	}

}


.setDaemon(true); 10_05참고
Thread를 상속받은 클래스를 데몬스레드로 동작하게
하는 명령어 .start();를 통해 작동하게 한다.

주 스레드가 끝나면 데몬스레드는 같이 종료된다.

동기화 Synchronization
멀티스레드는 공유자원을 임계영역에서 동시에
작업하고 있기때문에 제대로 명령어를 수행하지
못할 수있는 등의 문제가 있다.

synchronized를 통해 서로 방해받지 않게 차례대로
수행할 수 있게 동기화를 시켜줄 수 있다.
사용법은 두가지가 있는데
1. 메소드의 접근제어자 뒤에 작성하기
2. 메소드 안쪽에서 명령어를 synchronized로 감싸기
(synchronized (메인 클래스의 공유자원) {)

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

0609 JAVA 열여섯번째...  (0) 2022.06.10
0607 JAVA 열네번째 공부 정리~  (0) 2022.06.10
0602 JAVA 열두번째~  (0) 2022.06.02
0531 JAVA 열한번째  (0) 2022.06.01
0530 JAVA 열번째!!  (0) 2022.06.01