스레드,데몬스레드,컬렉션

이소연's avatar
Aug 05, 2024
스레드,데몬스레드,컬렉션
Contents
컬렉션
setvisible
final이니까 대문자로 표현한다. 그리고 이것은 상수 느낌의 의미
(그래서 1=어떤 의미 2= 어떤 의미 이런 식으로 정해 놨음)
notion image
 
그렇다면 2개를 실행해야 할 때 어떤 방법이 더 좋을까?
  1. main -sub1,2~ 더 좋음.,
  1. main가 하고, sub1가 함
 
어떤 게 더 좋지?
그림 그리는 메소드-메인?
 
 
람다 ~ p597
(runable꺼임. 어찌 저찌 해서)→{}요즘 이래 씀
익명?_회색 이거 쓰지만 new runnabl0()e쓰면~요즘 안 씀
 
데몬 스레드 : 죽지 않는 스레드(ex) while)
 
cpu에 메모리 달린 거 레지스터
요즘 삼성이 램에 cpu달아
 
thread 멈추는 법 : 교재방법보다는 상태값(ex) state)으로 true false를 걸어 멈춤
swing 쳐보면서 실력 늠
스레드가 꼭 필요한 예제
package ex16.example3; import javax.swing.*; public class ThreadEx03 extends JFrame { private boolean state = true; private int count = 0; private int count2 = 0; private JLabel countLabel; private JLabel count2Label; public ThreadEx03() { setTitle("숫자 카운터 프로그램"); setSize(300, 200); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 레이아웃 매니저 설정 setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS)); // 숫자를 표시할 레이블 생성 countLabel = new JLabel("숫자1: " + count); count2Label = new JLabel("숫자2: " + count2); countLabel.setAlignmentX(CENTER_ALIGNMENT); count2Label.setAlignmentX(CENTER_ALIGNMENT); add(countLabel); add(count2Label); // 증가 버튼 생성 JButton increaseButton = new JButton("멈춤"); increaseButton.setAlignmentX(CENTER_ALIGNMENT); add(increaseButton); // 버튼에 액션 리스너 추가 increaseButton.addActionListener(e -> { state = false; }); setVisible(true); new Thread(() -> { }).start(); new Thread(() -> { while (state) { try { Thread.sleep(1000); count++; countLabel.setText("숫자1: " + count); } catch (InterruptedException ex) { throw new RuntimeException(ex); } } }).start(); new Thread(() -> { while (state) { try { Thread.sleep(1000); count2++; count2Label.setText("숫자2: " + count2); } catch (InterruptedException ex) { throw new RuntimeException(ex); } } }).start(); } public static void main(String[] args) { new ThreadEx03(); } }
 
dip 추상적인 것에 의존한다.-v
 
우아한 기술 블로그
 

컬렉션

13장
 
선택정렬, 버블, 퀵솔트까진 등_주말에 2시간씩
 
내림차순, 오른차순
배열은 삭제 안됨.그래서 컬랙션 많이 씀?
 
[Vector랑 ArrayList 차이 ]_내용-v
-Vector는 동기화가 자동으로 되어있음
⇒ 동시 접근x
~ 그래서 멀티스레드에 많이 씀
+) 하지만 무조건 멀티스레드에 동기화가 필요한가?
no. 자료를 그냥 읽는 것은 동기화 안해도 됨. 같이 봐도 됨. 그렇지만 자료가 변경될 때에는 동기화가 필요.ex) account(계좌) 잔액을 그냥 read만 하는 거면 여러 명 같이 봐도 됨.
그렇지만 인출 등 변경(write)가 있을 때에는 동기화가 중요. 즉, 동시 접근하면 안됨.
 
-ArrayList가 동기화 x,
~그래서 단일스레드에 씀
  • - - - - - - - - - - — -
데드락
resorce라는 자원이 있고 그걸 이용하는 스레드가 있음
ex) 화장실이라는 resorce가 있고 그걸 이용하는 a,b,c 사람(스레드)가 있음.
그런데 1등 a는 5초가 걸리고 2등으로 온 b는 3초, 3등 c는 1초가 걸림.
 
+) 화장실을 arrraylist로 보면 화장실 크기가 2이면 abc하면 5개가 됨?
(ㅊ) 화장실 2칸, abc_이 말은 abc가 화장실2칸에 들어가는 게 아니라 화장실 크기 2개 필요하고 abc담을 배열도 3개 필요하니까 5개다??)?
 
동시 접근을 막아야 함 >> 스케쥴링(waiting 시간을 줄이는 거)_위의 경우 abc의 웨이팅을 줄여 효율적으로 하는 것.
 
⇒스케쥴링 알고리즘에는 다양한 것들이 있는데
>라운드로빈 : 1초씩 하는 거(전체 1씩)
5a(1s) > 3b(1s) > c ⇒ so c는 2초만 기달리면 됨.
5a(1s) > 3b(1s) > c > 4a > 2b>3a >b>2a>a~이런 느낌쓰 초는 중요x 너무 자세하게 안알아도 됨
 
동시 접근을 못하게 막는 것 : 싱크로나이즈
 
동기화의 필요성_ 예제) Account(계좌)
aacount에 1000원이 있다고 함. 그리고 인출(withdraw)를 하려고 함. 이런 경우는 동시에 접근 시 어떻게 될까?
동시 접근이 되면 서울,부산에서 동시에 인출하면 둘 다에게 1000원이 감. → 안돼
이런 경우에는 동기화가 필요하다. 동시 접근을 막아야 한다.⇒ 데드락(아무도 선택 못하게 만듦)을 걸어야 한다.⇒ 데드락의 방법은 다양한 데 그 중의 가장 심플한 동기화를 사용한다.
 
*데드락을 하면 동시 접근 가능/ 데드락을 안 하면 동시 접근 x
 
*교착
컴퓨터가 교착 상태이다 → 프로그램이 뻗은 것임→ 방법x. 재부팅해야함
app이 갑자기 꺼진다 → 교착 상태인 경우가 많다. (메모리 부족.. 여러 이유 들로)
 
listener-v
actionlistener?-pg606
 
Share article

Coding's note