어? 이게 되네
2022.04.12. 화요일 이공계 전문기술 연수사업 12일차 본문
오늘 배운 것
멀티쓰레드
ㄴ쓰레드 : 실행 중인 메소드
ㄴ멀티쓰레드 : 두 개 이상의 메소드를 가능하면 공평하게 실행시키는 프로그래밍 방식
----------------------------------------------------------------------
public class PersonTest {
public static void main(String[] args) {
Person p1=new Person("아아아");
Person p2=new Person("이이이");
p1.sayHello();
p2.sayHello();
}
}
hello 아아아
1
hello 아아아
2
hello 아아아
3
hello 아아아
4
hello 아아아
5
hello 아아아
6
hello 아아아
7
hello 아아아
8
hello 아아아
9
hello 아아아
10
hello 이이이
1
hello 이이이
2
hello 이이이
3
hello 이이이
4
hello 이이이
5
hello 이이이
6
hello 이이이
7
hello 이이이
8
hello 이이이
9
hello 이이이
10
메소드를 호출하면 호출한 순서대로 동작함.
p1.sayHello()가 모두 끝나야지만 p2에게 기회가 옴.
만약 p1의 sayHello()를 동작하다가 예외가 발생되어 중지되면 p2에게는 영영 기회가 오지 않을 수도 있음.
이 때, 가능하면 p1과 p2가 공평하게 어떤 기능을 동작하도록 하게하려면
멀티쓰레드 방식으로 프로그래밍함!
---------------------------------------------------------------------
자바에서 멀티쓰레드 프로그래밍 하기
Thread 클래스 상속받아 공평하게 실행시키고자 하는 일을
run() 메소드를 오버라이딩하여 그 안에 써줌.
객체를 생성하여 공평하게 일을 시키는 것을 쓰레드를 가동한다라고 함.
start() 메소드를 호출하여 가능하면 공평하게 일을 시킴. //방법 1
Runnable 인터페이스를 구현한 클래스를 만들고
run() 메소드를 오버라이딩하여 그 안에 공평하게 시키고자 하는 명령어들을 써줌.
(=> 이 이유 : 인터페이스는 다중상속
새로 만들려는 클래스가 이미 있는 다른 클래스로부터 상속을 받아야 하고 멀티쓰레드도 되어야 함.
자바는 클래스의 다중 상속이 되지 않으므로 이 때에는 Runnable 인터페이스를 이용하는 것임.) -*
쓰레드를 가동시키기 위해서는, 인터페이스 안에는 body가 구체화된 메소드가 없음.
즉, 인터페이스 자신이 start할 수 없어서 Thread 객체로 포장하여 start()를 호출해야 함.//방법 2
*class MyBall extends JPanel implements Runnable{
//내가 만드는 클래스가 그래픽을 표현하기 위해서 JPanel을 상속받아야하고
멀티쓰레드도 구현하기 위해서 쓰레드 클래스를 상속받고 싶은데 자바에서는 그러지 못하기 때문에
Runnable 인터페이스를 상속받게함 !
---------------------------------------------------------------------
쓰레드의 우선순위 설정하기
setPriority(int newPriority)
우선 순위에 설정할 수 있는 값은 1~10
public static final int MAX_PRIORITY 10
public static final int MIN_PRIORITY 1
public static final int NORM_PRIORITY 5
가능하면 일을 일찍 끝내달라고 요청하는 것이지 우선순위를 높게 설정했다고 해서
반드시 그 쓰레드가 작업을 먼저 완료하는 것은 아님.
----------------------------------------------------------------------
그래픽을 표현하려면 JPanel을 상속받아 paintComponent를 오버라이딩하여
그래픽을 표현함. 이 객체를 생성하여 프레임에 담으면 됨.
----------------------------------------------------------------------
임계영역
ㄴ두 개 이상의 쓰레드가 어떠한 변수를 공유하고 있을 때
동시에 두 개의 쓰레드가 접근할 수 없고 한 번에 하나의 쓰레드에게만 접근토록 하는 영역
임계영역에 접근하는 메소드에 synchronized 라는 키워드만 붙이면 됨.
----------------------------------------------------------------------
쓰레드 사이의 통신
ㄴ쓰레드를 가동하면 가능하면 서로 공평하게 실행이 되게끔 스케쥴링을 해줌.
하지만 그게 반드시 공평한 건 아님!
만약 반드시 공평하게 동작하도록 하려면 쓰레드 사이에 통신이 필요함.
상대방 쓰레드가 종료할 때까지 내가 기다리고
내가 작업이 끝나면 기다리고 있는 상대방 쓰레드를 깨워줌.
기다리고 깨워주는
쓰레드 사이의 통신을 위한 메소드를 이용함.
쓰레드 사이의 통신을 위하여 Object(자바 클래스의 최고 조상)의 wait(); notify(); 메소드를 이용함.
wait()
ㄴ다른 쓰레드가 일을 끝마칠 때까지 기다림.
notify()
ㄴ내가 일이 끝나면 기다리고 있는 다른 쓰레드를 깨워줌.
오늘 헷갈린 것
- 아직도 왜 하필 저 클래스에서 저 메소드를 선언하는지. 헷갈린다 ㅠㅠ 객체 개념이 아직 확립되지 않아서겠지..?
오늘 한 생각
포도막염이 점점 낫고 있는 것 같아서 기분 좋다~! 역시 스트레스 잘 처리하는 것이 중요하다..
이제부터 슬슬 평일 복습을 습관화하는 작업을 할 것이다.
아그리고 키보드 타자감 너무 좋다.. 카타르시스 느껴짐...약간 연습문제 맞았을 때처럼... 변탠가...
'TIL' 카테고리의 다른 글
2022.04.18. 월요일 이공계 전문기술 연수사업 16일차 (0) | 2022.04.18 |
---|---|
2022.04.13. 수요일 이공계 전문기술 연수사업 13일차 (0) | 2022.04.13 |
2022.04.11. 월요일 이공계 전문기술 연수사업 11일차 (0) | 2022.04.11 |
2022.04.08. 금요일 이공계 전문기술 연수사업 10일차 (0) | 2022.04.08 |
2022.04.07. 목요일 이공계 전문기술 연수사업 9일차 (0) | 2022.04.07 |