달력

5

« 2018/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
2018. 5. 27. 21:28

Collection Framework 스터디 /1.Java2018. 5. 27. 21:28

지금부터


컬렉션프레임워크에 대해서 정리해나갈예정이다

세세하게 훑고가기전에


먼저 기본적인 개념과

그리고 어떻게 사용하는지

그리고 세세한 개념

그런 방식으로 정리해갈 예정이다.


컬렉션프레임웍--> 데이터군을 저장하는 클래스들을 표준화한 설계를 뜻한다.


컬렉션(Colletion은 다수의 데이터, 즉 데이터 그룹을

프레임웍은 표주화된 프로그래밍 방식을 의미한다.


----

컬렉션 프레림웍은 컬렉션, 다수의 데이터를 다루는데 필요한 다양하고 풍부한 클래스들을 제공하기 때문에

프로그래머의 짐을 상당히 덜어주고 있음!


--


[컬렉션 프레임웍 핵심 인터페이스]

컬렉션 프레임웍에서는 컬렉션데이터그룹을 크게 3가지 타입이 존재한다고인식하고,

각 컬렉션을 다루는데 필요한 기능을 가진3개의 인터페이스를 정의한다


그리고 인터페이스 List와 Set의 공통된 부분을 다시뽑아서 새로운 인터페이스인(Collection)을 추가로 정의하였다.


Map, List, Set

(List,Set) -->Collection


리스트->순서가있는 데이터의 집합, 데이터의 중복을 허용한다. ex)대기자명단

-->ArrayList, LinkedList, Stack , Vector


셋-->순서를 유지하지 않는 데이터의 집합, 데이터의 중복을 허용하지 않는다. ex)양의정수집합, 소수의집합

-->HashSet,TreeSet


맵-> 키와 값의 쌍(pair)으로 이루어진 데이터의 집합 

순서는 유지되지않으며, 키는 중복을 허용하지 않고, 값은 중복을 허용한다.

ex)우편번호, 지역번호(전화번호)


-->HashMap, TreeMap, Hashtable,Properties등 


각인터페이스의 특징과 차이를 잘이해하고있어야한다. 

컬렉션프레임웍의 모든클래스들은 저중의 하나를 구현하고있으며 

구현한 인터페이스의 이름이 클래스에 포함되어있어서 이름만으로 클래스의 특징을 알수있도록 했는데


Vector, Stack, Hashtable, Properites와 같은 클래스는 컬렉션 프레임웍이 만들어지기 전부터 존재하던 것이라

컬렉션 프레임웍의 명명법을 따르지 않는다.


벡터나 해쉬테이블같은건 기존의 컬렉션 클래스들은 호환위해

설계변경위해 남겨뒀지만 그대신 

새로 추가된 어레이리스트와 해쉬맵을 사용하자 



리스트와 셋의 조상인 컬레견 인터페이스에는 메서드들이 정의되어있는데, 

컬랙션 클레스에서 저장된 데이터 읽고 추가하고 삭제하는등 컬렉션을 다루는데 가장 기본적인 메서드들을 정의하고았음.

-------------------------------------

리스트인터페이스는

중복을 허용하면서 저장순서가 유지되는 컬렉션을 구현하는데 사용된다.


중복허용!!!, 저장순서유지!! 


------------------------------

셋인터페이서는 중복을 허용하지않고 저장순서가 유지되지않는 컬렉션 클래스를 구현하는데 사용


-------------

맵인터페이스 

키 값을 하나의쌍으로 묶어서 저장하는 컬렉션 클래스 구현하는데 사용 

키는 중복될수없지만 값은 중복허용 

기존에 저장된 데이터와 중복된 키와 값을 저장하면 기존 값 없어지고 마지막에 저장된값이 남게된다.

-----------------------

Map.Entry인터페이스 Map인터페이스의 내부인터페이스다.

내부클래스와같이

인터페이스도 인터페이스안에  인터페이스를 정의하는 내부인터페이스를 정의하는것도 가능하다.

------------

 

:
Posted by Gongdile
2018. 5. 24. 17:43

[Android]프레퍼런스(Preference) 스터디 /6. Android2018. 5. 24. 17:43

프레퍼런스가 뭘까?

-->응용프로그램의 설정 정보를 영구적으로 저장하는 장치다. 


사용자의 옵션 선택사항, 프로그램 자체 구성정보등을 저장 

-->한번 선택해 놓은 옵션 다음 실행시에도 계속 기억하는 역할!


윈도우즈 환경의 레지스트리, 

리눅스 환경 세팅파일 정도에 대응되는 개념

 -->XML 포맷의 텍스프 파일에 정보를 저장하므로 세팅파일에 더 가깝다. 


프레퍼런스의 데이터를 관리하는 클래스 --> SharedPreferences 


응용프로그램 내의 모든 액티비티가 공유하므로 Shared라는 이름이 붙어있다. 


한쪽 액티비티에서 프레퍼런스의 정보를 수정하면 다른 액티비티도 수정된 값으 읽을 수 있다.

그러나 응용 프로그램 내부의 고유한 정보이므로 외부에서는 읽을 수 없다. 


이 객체는 컨텍스트의 다음 메서드로 생성한다.

SharedPreferences getSharedPreferences (String name, int mode)


첫번째 인수는 프리페런스를 저장할 xml파일의 이름이다. 

mode 인수는 이 파일의 공유모드임 

MODE_WORLD_READABLE ->읽기 공유

MODE_WORLD_WRITEABLE -> 쓰기 공유 

---------------------------


이 부분을 얘기하다가 말았는데 

안드로이드에서 데이터 저장하는 방법에는 이런게있음 


방법 

설명 

공유 프레퍼런스(Shared Preferences) 

키-값 쌍(key-value pair)으로 사적이고 기초적인 데이터를 저장한다 

내부 저장(Internal Storage) 

사적인 데이터를 내부 저장소에 저장한다. 

외부 저장(External Storage)

공유 데이터를 공유 외부 저장소에 저장한다. 

SQLite 데이터베이스(SQLite Database) 

구조화된 데이터를 사적인 데이터베이스에 저장한다.

 

네트워크 연결(Network Connection) 

데이터를 네트워크 서버에 저장한다. 


:
Posted by Gongdile

BR

백그라운드에서 실행되는 서비스와 통지,BR등에서 

사용자에게 알림을 보낼 수 있는 여러가지 방법에 대해 알아 보고 

앱 사이의 공식적인 통신방법인 BR제작을 실습하는거 


오늘 학원에서 통지 부분을 나갔다. 


백그라운드 프로세스는 어떤 사건 발생할때 사용자에게 확실하게 알릴만한 방법이 없음 


토스트가 있긴하겠지만

부재중 전화나 약속시간을 토스트만 잠시보여주고 말아버리면 곤란하잖음 

대화상자같은 경우도 사용자가 화면을 보기 전에는 확인하지 않아서 마찬가지임 


그래서 백그라운드 프로세스에서 사용자와 통신할 수 있는 더 확실한 방법이 필요한데 

그게 바로 통지(Notification)이다. 


우리 휴대폰 맨윗상단에는 상태란이있어서 

오른쪽에 시간, 배터리잔량 네트워크등이 표시되는데 


상태란의 왼쪽부분에 통지 아이콘이 나타난다.

부재중전화, 메시지나 배터리부족하다 usb연결 등등..알려줄때 


통지는 최초 잠깐만 보이지만 토스트와는 달리 사용자가 확인하기 전에는 아이콘이 계속 표시되고

소리, 진동, 불빛같은 적극적인 방법으로 신호를 보낼수있다. 

사건발생 사실만 아이콘으로 표시하고 구체적인 내용은 당장 보이지 않지만

상태란을 아래로 드래그해서 확장하면 상세한 정보가 출력되게말이다. 


통지 뷰의 모습은 버전이나 장비에따라 다르다.



통지를 그러면 어떻게 사용할까? 어떻게 출력하까 ㅋㅋㅋㅋㅋㅋㅋㅋ 

오늘 이것에 대해 배웠기 때문에 정리한다!!!


통지를 출력하려면 통지 관리자(NotificationManager)통지 객체(Notification) 둘을 사용한다. 


근데 이 둘을 사용하는데 준비해야할게 많아서 번거롭더라 


간단하게 말하면 이런느낌이다 : 인텐트 ~ -> 펜딩인텐드  ~-> notification~~


먼저 어떤 내용을 어떻게 알릴지 통지 객체를 생성하고 , 여러가지 속성을 원하는 대로 설정한다. 

통지 객체의 생성자는 이렇다.

Notification()
Notification(int icon, CharSequence tickerText. long when)

인수를 받지 않는 디폴트 생성자로 생성한후에 

속성을 설정하거나 아이콘, 티커텍스트, 통지발생시간등을 인수로 전달한다.


이전버전에서는 주로 생성자로 직접 통지 객체를 생성하고 

setLatestEventinfo 메서드로 선택시 동작을 정의했는데 


3.0이후에는 통지영역에 출력할 수 있는 옵션이 대폭적으로 늘어났다. 

그래서 빌저를 통해 객체를 생성하는 것으로 변경됨. 


빌더의 생성자는 이렇다. (사실 이런건 예제 한번 훅 보는게 더빠른듯)


Notification.Builder(Context context)

인수로 리모트뷰 생성에 사용할 컨텍스트를 전달하는데 통지 객체를 생성하는 액티비티를 전달한다.

이후에 다음 메서드로 통지 객체의 속성을 설정한다. 


속성의 종류가 굉장히 많아서 기본속성부터 정리하겠음


1.Notification.Builder  setTicker(CharSequence tickerText [ , RemoteViews views])

->티커 텍스트는 통지영역에 아이콘이 처음 나타날때 잠시 출력될 짧은 문자열이다.

   잠시만 보였다 금방 사라지지만 통지 전달 시점에 화면을 보고 있다면 

   티커 텍스트만 보고도 무슨일이 일어났는지 알 수 있다.

(단순 문자열 외에 커스텀 리모트 뷰를 지정하면 더 복잡한 정보도 출력할 수 있다.)

2.Notification.Builder  setWhen(long when)

->when은 통지가 발생한 시간을 지정하는데 

   System.currentTimeMillis 메서드로 구현한 현재 시간을 지정하는것이 보통이고 

   디폴트도 현재 시간으로 되어있다.

3.Notification.Builder  setSmallIcon(int icon [, int level])

->아이콘은 두가지 상태를 지정할 수 있는데 

   작은아이콘은 상태란 왼쪽에 티커 텍스트와 함께 표시되고, 상태란을 펼쳤을때 통지뷰에도 나타난다.

   또 티커 텍스트가 사라진 후에는 상태란에 작은 아이콘만 남아 통지가 발생했음을 알리는 역할을 한다.

  (면적이 그다지 넓지 않아서 작은아이콘만 표시할수있다.)

3.0이후에는 큰 아이콘도 추가로 표시할 수 있는데 통지 뷰에 나타난다.


큰아이콘이 없으면 작은 아이콘이 통지뷰에 대신 표시되지만,

큰아이콘이 지정되면 통지 뷰에는 큰 아이콘이 사용되며 작은 아이콘은 오른쪽에 표시된다. 

-->통지의 기능이 확장됨으로 인해서 단순히 사건 발생만을 알리는게 아니라 

    사건에 대한 정보를 표시하는 큰아이콘이 필요해졌다. 


4.Notification.Builder  setLargeIcon(Bitmap icon)

->큰 아이콘은 SNS 메시지의 사용자 사진, 멀티미디어 앱의 앨범 자켓 등을 보여주는 용도로 사용된다. 



아래 메서드는 통지 뷰에 대한 여러가지 속성을 설정한다.

(위에 메서드는 통지 객체의 속성 설정! 여기 아래는 통지 뷰에 대한 여러가지 속성 설정) 


Notification.Builder  setContentTitle(CharSequence title)

Notification.Builder  setContentText(CharSequence text)

Notification.Builder  setSubText(CharSequence text)

Notification.Builder  setContentIntent(PendingIntent intent)


-->통지 뷰에는 상단제목, 중간내용, 하단의 서브텍스트 등 총 3개의 문자열을 표시한다. 

모든 문자열을 다 표시할 필요는 없다. 필요한 만큼만 표시하면 된다. 

문자열이 많으면 오히려 너무 번잡스러워서 

제목에 사건 개요를 적고 내용에 상세 메시지 정도만 표시하는게 일반적이다.


사용자가 통지 뷰를 클릭했을 때의 동작은 setContentIntent 메서드로 펜딩 인텐트를 전달하여 지정한다. !!!!


그래서 아까 위에서 펜딩인텐트 얘기를 꺼낸거 !!!! 그래서 난이제 펜딩인텐트에 대해서 설명하겠다.


<PendingIntent>


펜딩인텐트 클래스는 인텐트를 래핑하며 다른 응용프로그램으로 전달하여 실행 권한을 준다. 

( 보통의 인텐트와 다르다. )


통지를 등록하는 앱과 통지 뷰를 관리하는 앱이 다르기 때문에 

일반 인텐트로는 의도를 전달할 수 없다.

펜딩 인텐트는 시스템이 관리하며 인텐트를 만든 으용프로그램이 종료되어도 유효하다. 


생성자가 정의되어 있지 않아서 객체를 직접 생성할 수 없고, 

아래에 있는 세개의 정적 메서드 중 하나로 생성한다. 


(1)PendingIntent getActivity (Context context, int requestCode, Intent intent, int flags)

(2)PendingIntent getBroadcast (Context context, int requestCode, Intent intent, int flags)

(3)PendingIntent getService (Context context, int requestCode, Intent intent, int flags)


얘네 세개의 메소드 차이는 인텐트로 무엇을 띄울 것인가에 따라 메소드가 나누어져 있다. 


액티비티를 띄울 예정이다 -->(1)메서드로 펜딩 인텐트를 생성한다.

context인수는 인텐트를 등록하는 주체이며 intent는 실행할 작업이다. 


펜딩 인텐트를 등록해 놓으면 시스템이 인텐트를 가지고 있다가 통지 뷰가 클릭될 때 내부의 인텐트를 실행한다. 


get Activity로 생성된 인텐트는 결국 startActivity를 호출하여 인텐트가 지정하는 액티비티를 띄운다. 

통지 뷰에서는 주로 액티비티를 띄우는데 

이 경우 인텐트에는 FLAG_ACTIVITY_NEW_TASK 플래그를 지정하여 새로운 태스크를 시작하게 한다. 

(2),(3) 메서드는 방송을 보내거나 서비스를 호출한다. 


펜딩인텐트에 관한 자세한 설명은

https://developer.android.com/reference/android/app/PendingIntent

여기 사이트에 있는데 영어다 !! 하하 ..ㅋㅋㅋㅋㅋ 


저 세개의 메서드중 flag부분에 대해서 더 자세하게 다뤄보려고 한다. 

저기 pending intent 에서 flag를 제공해주는데 


  • FLAG_CANCLE_CURRENT

-->이전에 생성된 펜딩인텐트는 취소하고 새롭게 하나를 만든다.

  • FLAG_NO_CREATE 

-->현재 생성된 펜딩인텐트를 반환한다.

  • FLAG_ONE_SHOT 

이 플래그를 이용해 생성된 펜딩인텐트는 단 한번 밖에 사용될 수 없다.일회용카드!!

  • FLAG_UPDATE_CURRENT

만일 이미 생성된 펜딩인텐트가 존재한다면 해당 인텐트의 내용을 변경한다. 


아까 위에서 설명할때 진동이나 빛 소리등으로 적극적! 으로 알릴 수 있다고 얘기했는데

그거와 관련된 빌더의 고급 속성 고급 메서드!!을 알아보자 



Notification.Builder  setLights(int argb, int onMs, int offMs)

-->통지 발생시에 장비의 LED를 깜박거리며 색상과 주기를 지정한다.

    모든 장비가 LED를 가지고 있지 않으며 지원하는 색상도 제한적이라서 반드시 제한된 색상대로 출력되는건 아니다.

Notification.Builder  setNumber(int number)

-->통지와 함께 숫자 하나를 보여주는데 여러 가지 의미로 사용된다.

ex))부재중 메시지 알림의 경우 총 몇 통의 메시지가 왔는지 표시하고 

    충전중 알림이라면 충전 진행 정도를 표시한다. 

Notification.Builder  setOngoing(boolean ongoing)

-->일회적인 알림이 아니라 음악 재생이나 싱크 등의 작업이 진행 중임을 나타낸다. 

    사용자가 통지를 직접 제거할수 없다. 코드에서 작업 완료시에만 제거할 수 있다.

 

Notification.Builder  setSound(Uri sound [ , int streamType])

Notification.Builder  setVibrate(long[ ] pattern)

--> 통지 발생시 사운드를 낸다던가 진동을 발생 시킬 수 있다.

통지는 주로 화면이 꺼진 상태에서 발생하므로 소리나 진동을 통해 사용자에게 적극적으 알리는게 좋다.


이런 모든 설정등이 완료되면 최종적으로 이 메서드를 호출해서 통지 객체를 생성한다.!!!


Notification build( )


=>빌더의 모든 메서드는 빌더 자신을 리턴하므로 연쇄적인 호출이 가능하다. 

    최종적으로 build 메서드를 호출함으로써 통지 객체를 생성한다


대부분 속성은 빌드 메서드로 지정하지만 통지 객체를 생성한 후에도 필드를 직접 조작할 수 있다. 

이전 버전에서는 필드를 직접 조작했지만, 지금은 빌더에 이런 속성들을 변경하는 메서드가 제공되서

가급적이면 빌더를 통해 속성을 설정하는 것이 좋다. 


필드 

설명 

number 

 통지 아이콘에 겹쳐서 출력될 숫자를 지정한다.

ex))새로운 메시지 도착했다는 통지라면 메시지 개수 같이 표시할 수 있다.

     0이나 음수를 지정하면 숫자가 표시되지 않는다.

sound 

통지와 함께 출력할 소리를 Uri 객체로 지정한다. 

vibrate 

진동 방식을 지정한다. 

진동할 시간과 멈출 시간을 배열로 전달해서 진동 패턴을 지정한다. 

ledARGB

불빛의 색상을 지정한다. 장비에 장착된 LED 능력에 따라 표현 가능한 색상은 달라진다.

ledOnMs 

LED 켤 시간과 끌 시간을 1/1000초 단위로 지정한다.

이 두 값은 LED점멸 주기를 지정한다. 

정확하진 않지만 장비는 가능한 근접한 시간을 지킨다.

ledOffMs 

defaults 

디폴트로 취할 통지 전달 방식을 지정한다.

flags 

통지의 동작 방식을 지정한다. 



주로 소리나 진동을 같이 사용하는데 소리 파일이다 진동 패턴을 직접 만들기는 번거롭다.

그래서 시스템은 디폴트 소리와 진동 기능을 제공하고 defaluts필드에 어떤 기능을 사용할건지 지정한다.



:
Posted by Gongdile
2018. 5. 17. 09:27

[Git] Eclipse git 사용법 스터디 /7. 형상관리2018. 5. 17. 09:27

프로젝트를 같이 하다보니 소스관리할때 이클립스에서 깃을 사용하기로했다.

대략적인 개념은 알고있는데 ㅋㅋㅋ 혼동되기도하고 일단은 필요한거만 정리 ! 


--

도움이 된 링크를 정리한다


A B개발자가 Git을 함께쓴다고 가정하고 올린글..

http://lng1982.tistory.com/177


나는 지금 총3명이서 깃으로 진행중인데.. 올리는 방법에 대해서는 냐중! 지금은 사용법이 우선!


중요한건 마스터 아래 브랜치를 따서 관리할때 


내가 내이름의 branch를 따서 작업하다가 master로 커밋하고싶으면.. 


내이름의 branch에서 일단 커밋을 하고 


sitch to -> master로 전환한뒤에 


team -> Merge로 병합을 한다 .



깃입문관련 자료다 -->https://backlog.com/git-tutorial/kr/stepup/stepup1_1.html

이해하기 쉬움                                                                                               

:
Posted by Gongdile

음 이런 내용에 대해 꼭 알아야해! 완전 중요해! 필수야! 이런건아니지만.. 

알아서 나쁠거없고 다 차곡 차곡 쌓이는 지식이기 때문에 ㅎㅎㅎㅎ ! 


정리를 해본다.. 


쓰레드 그룹은 말그대로 thread group이다 ㅋㅋ 

서롸 관련된 쓰레드를 그룹으로 다루기 위한걸로 폴더를 생성해서 관련된 파일들을 함께 넣어서 

관리하는 것처럼 쓰레드 그룹을 생성해서 쓰레드를 그룹으로 묶어서 관리할 수 있다. 

폴더 안에 폴더를 넣는거마냥 

쓰레드 그룹에 다른 쓰레드 그룹을 포함시킬수도 있는데 


쓰레드 그룹은 보안상의 이유로 도입된 개념이라고 한다.(자세한건 더 찾아봐야할듯)

자신이 속한 쓰레드 그룹이나 하위 쓰레드 그룹은 변경할 수 있지만 

다른 쓰레드 그룹의 쓰레드를 변경할수는 없는부분?!


자바에서 ThreadGroup을 사용해서 생성할 수 있고, 주요 생성자와 메서드를 제공한다. 

쓰레드는 반드시 쓰레드 그룹에 포함되있어야하기때문에


쓰레드 그룹을 지정하는 생성자를 사용하지 않은 쓰레드는 기본적으로 

자신을 생성한 쓰레드와 같은 그룹에 속한다. 


자바 어플리케이션이 실행되면 JVM은 main과 system이라는 쓰레드 그룹을 만들고 JVM운영에 필요한 쓰레드를 생성!

그리고 그 쓰레드 그룹에 포함시킨다. 


ex) main메서드를 수행하는 main이라는 이름의 쓰레드는 main쓰레드 그룹에 속하고, 

가비지 컬렉션을 수행하는 Finalizer쓰레드는 system쓰레드 그룹에 속한다. 


우리가 생성하는 모든 쓰레드 그룹은 main쓰레드 그룹의 하위 쓰레드 그룹이 되며, 

쓰레드 그룹을 지정하지 않고 생성한 쓰레드는 자동적으로 main쓰레드 그룹에 속하게된다. 



음 내가 이걸 정리하면서 느끼는건 아.. 이런게 있구나 !_! 

쓰레드그룹이라는게 있고 이렇게 사용하는구나..! 

나중에 정리해야할 일이 있으면 그때 더 자세히.. 


<데몬스레드(daemon thread)와 일반 스레드(non-daemon thread)>


자바에서 스레드는 두가지 종류로 구분된다.


첫째는 데몬 스레드(daemon thread)인데 JVM이 스스로 필요에 의해 사용하는 스레드이다. 

데몬쓰레드는 다른 일반 쓰레드의 작업을 돕는 보조적인 역학을 하는 쓰레드라서 

일반 쓰레드가 모두 종료되면 데몬 쓰레드는 강제적으로 자동 종료된다. 

-->데몬 쓰레드는 일반 쓰레드의 보조역할을 수행하기때문에  일반스레드가 종료되고나면 

    데몬쓰레드의 존재의 의미가 없기 때문이다. 

(JVM은 응용프로그램에서 생성한 일반 스레드가 하나라도 살아 있는 한 실행을 계속 한다.)

이 점을 제외하고는 일반쓰레드와는 다르지 않다. 


ex))가비지컬렉터, 워드프로세서 자동저장, 화면 자동갱신 등이있다.. 

가비지 걸렉터가 대표적인 데몬스레드인데 응용프로그램에서 작성한 스레드를 데몬스레드로 표시해서 

JVM이 데몬스레드로 인식하게 할 수도있다.


데몬 쓰레드는 무한루프와 조건문을 이용해서 실행 후 대기하고 있다가 특정 조건이 만족되면 

작업을 수행하고 다시 대기하도록 작성한다.

--

데몬쓰레드는 일반스레드의 작성방법과 실행방법이 같다.

 다만 

쓰레드를 생성한 다음 실행하기 전에  setDaemon(true)를 호출하기만 하면 된다. 

(데몬스레드가 생성한 쓰레드는 자동적으로 데몬쓰레드가 된다! )

 


일반쓰레드 (non-daemon thread)는 응용프로그램에서 생성한 스레드이다. 

main( )메소드도 대표적인 일반쓰레드다. 


:
Posted by Gongdile

쓰레든느 우선순위(priority)라는 속성(멤버변수)를 가지고 있다. 

이 우선순위의 값에 따라 쓰레드가 얻는 실행시간이 달라진다. 


쓰레드가 수행하는 작업의 중요도에 따라 쓰레드의 우선순위를 서로 다르게 지정하여 특정 쓰레드가 더 많은 작업시간을 갖도록 할 수 있다. 


예를들어서 내가 카카오톡을 하는데 파인을 다운로드 처리하는 쓰레드보다 채팅 내용 전송하는 쓰레드 우선순위가 더 높아야

채팅하는게 불편함이 없을거다.

카카오톡 하는데 사진다운 받는동안은 채팅을 못한다던가.. 기다려야한다던가 이러면 엄청 불편할것이다. 


이렇게 시각적인 부분이나 사용자에게 빠르게 반응해야하는 작업을 하는 쓰레드의 우선순위는 다른 작업을 수행하는 쓰레드에 비해 높아야 한다.



<쓰레드의 우선순위 지정하기>


쓰레드의 우선순위와 관련된 메서드와 상수는 다음과 같다. 


void setPriority (int newPriority)  쓰레드의 우선순위를 지정한 값으로 변경한다.
int getPriority()                         쓰레드의 우선순위를 반환한다.
 
public static final int MAX_PRIORITY    = 10 //최대 우선순위 
public static final int MIN_PRIORITY     =  1 //최소 우선순위 
public static final int NORM_PRIORITY  =  5 //보통 우선순위 


쓰레드가  가질 수 있는 우선순위 범위는 1~10이고 숫자가 높을수록 우선순위가 높다. 

알아둬야할건 쓰레드의 우선순위는 쓰레드를 생성한 쓰레드로부터 상속받는다는 것이다. 


main메서드를 수행하는 쓰레드를 우선순위가 5이므로 main메서드 내에서 생성하는 쓰레드의 우선순위는 자동적으로 5가 된다.


-->우선순위는 쓰레드를 실행하기 전에만 변경할수 있다! 

그치만 

(싱글 코어 가정)

두쓰레드의 우선순위가 같은경우시 작업하는것과 

t1이 t2보다 우선순위가 높은경우 에 작업하는것을 비교한다면 


우선순위가 같은 겨웅네는 각쓰레드에 거의 같은 양의 실행시간이 주어지지만, 

우선순위가 다르다면 우선순위가 높은 t1에게 상대적으로 t2보다 많은 양의 실행시간이 주어지고

-->결과적으로 작업 A(t1담당)가 작업 B(t2담당)보다  더 빨리 완료될수 있다. 


그러나 멀티코어에서는 쓰레드의 우선순위에 따른 차이가 거의 없었다. 

-->쓰레드에 높은 우선순위를 주면 더 많은 실행시간과 실행기회를 갖게될거라고 기대할수는 없다는거..ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 


그래서 굳이 우선순위에 차등을 두어 쓰레드를 실행하려면, 특정 OS의 스케쥴링 정책과 JVM의 구현을 직접확인해 봐야하는데 


차라리 쓰레드에 우선순위를 부여하는 대신 작업에 우선순위를 두어서 Priority Queue에 저장해놓고, 우선순위가 높은 작업이 먼저 처리되도록

하는게 나을수도 있다.! 



:
Posted by Gongdile

저번에 멀티쓰레드와 멀티프로세스에 관해서 설명한적이 있는데 

이번에는 싱글쓰레드와 멀티쓰레드에 관해 다뤄보려고한다.


그전에 컨텍스 스위칭에대해 알고넘어가사 


컨텍스트 스위칭(context switching)이란 프로세스 또는 쓰레드 간의 작업 전환을 말한다. 


<가정을 해보자> 

두개의 작업을 

-하나의 쓰레드(t1)로 처리하는 경우 

-두 개의 쓰레드로 처리하는경우(t1,t2)


t1으로 두 작업을 처리하는 경우는 한 작업을 마친후에 다른 작업을 시작한다.

t1,t2으로 작업하는 경우 짧은시간동안 2개의 쓰레드가 번갈아가며 작업을 수행해서 동시에 두작업이 처리되는 것과 같이 느끼게한다.


싱글코어에서 싱글쓰레드 프로세스와 멀티쓰레드 프로세스를 비교하면 


두 경우다 작업을 수행한 시간은 거의 같다. 

오히려 두 개의 쓰레드로 작업한 시간이 싱글쓰레드로 작업한 시간보다 더 걸리는데 

그 이유는 

쓰레드간 작업전환(context switching)에 시간이 걸리기 때문이다. 

작업전환을 할대는 현재 진행 중인 작업의 상태등을 저장하고 읽어 오는 시간이 소요된다. 

(쓰레드 스위칭에 비해 프로세스 스위칭이 더 많은 정보 저장해야하므로 더 많은 시간이 소요됨!)


그래서 싱글코어에서 단순 cpu만을 사용하는 계산작업이라면 오히려 멀티쓰레드보다 싱글쓰레드로 프로그래밍 하는게 더 효율적이다.


두 개의 쓰레드로 작업하는데 더 많은 시간이 걸린 이유는 두가지다.

(1)두 쓰레드가 번갈아가며 작업을 처리하기에 쓰레드간 작업전환시간이 소요됨

(2)한 쓰레드가 화면에 출력하고 있는 동안 다른 쓰레드는 출력이 끝나기 기다려야하는데 이때 발생하는 대기시간 때문이다.



여러 쓰레드가 여러 작업을 동시에 진행하는 것을 병행(concurrent)라고 하고, 

하나의 작업을 여러 쓰레드가 나눠서 처리하는 것을 병렬(parallel)이라고 한다. 




1.싱글코어로 두 개의 쓰레드를 실행하는 경우와 

2.멀티코어로 두개의 쓰레드를 실행하는 경우에도 차이가 발생한다.


1의 경우는 멀티쓰레드라도 하나의 코어가 번갈아가며 작업을 수행하는 거라 두 작업이 절대 겹치지 않는다.

2의 경우는 멀티쓰레드로 두 작업을 수행하면, 동시에 두 쓰레드가 수행될 수 있으므로 

               두 작업, A와B가 겹치는 부분이 발생한다. 

--> 그래서 화면(console)이라는 자원을 놓고 두쓰레드가 경쟁하게된다. 

 

하지만 이런 결과는 실행할때마다 다른 결과를 얻을 수 있다. 

왜냐면 내가 실행하고있는 예제프로그램(프로세스)이 OS의 프로세스 스케줄러의 영향을 받기 때문이다. 


JVM이 쓰레드 스케줄러에 의해 어떤 쓰레드가 얼마동안 실행될건지 결정하는거와 같이 

프로세스도 프로세스 스케줄러에 의해서 실행순서와 실행시간이 결정되기 때문에 


매 순간 상황에 따라 프로세스 할당되는 실행시간이 일정치않고, 쓰레드에게 할당되는 시간 도한 일정하지 않다. 

--> 그래서 쓰레드가 이런 불확실성을 가지고 있다는 것을 염두에 둬야한다.


자바가 OS에 독립적이라곤 하지만 실제로는 OS종속적인 부분이 몇가지 있는데 쓰레드도 그 중의 하나이다.

(JVM종류에 따라 쓰레드 스케줄러의 구현 방법도 다를수 있다.)


..그림 나중에 첨부해야지!! 



두 쓰레드가 서로 다른 자원 사용하는 작업의 경우는 싱글쓰레드 프로세스보다 멅이쓰레드 프로세스가 더 효율적이다. 


ex)) 사용자로부터 데이터 입력받는 작업, 네트워크 파일 주고받는 작업, 프린터로 파일 출력하는 작업 

-->외부기기와의 입출력을 필요로 하는경우 


(A)사용자로부터 입력받는 작업

(B)화면에 출력하는 작업 


이 두가지를 하나의 쓰레드로 처리하면 사용자가 입력을 마칠 때까지 아무 일도 하지 못하고 기다려야한다. 

그러나 두 개의 쓰레드로 처리하면 사용자 입력 기다리는 동안 다른 쓰레드가 작업을 처리할 수 잇기 때문에 보다 효율적인 cpu사용이 가능하다.



:
Posted by Gongdile
2018. 5. 16. 14:12

글쓰면서 느낀거 개인/생각 정리2018. 5. 16. 14:12

공부목적으로 블로그를 작성한거라 

공부할일이 있거나 시간을 내서 정리하는 편인데 

책이나 피피티등 자료에서 충분히 나오는 부분을 굳이 세세하게 설명할 필요가 없다고 느꼈다.

물론 내가 모르겠어서 세세하게 풀어야한다면 의미가 있겟지만


블로그에 정리하는거니까 더  자세히 자세히 ! 막 이럴 필요는 없을거같다 

그러면 흥미도 좀 사라질거같아서 

순서가 뒤죽박죽이거나 빠지는 부분이 있더라도 내가 시간을 내서 생각하고 정리한거에 의미를두고 

시간 날때마다 글쓴거 보면서 추가하고 빼는게 더 효율적인거같다.


뭔가 완벽하게 빼먹지말고 잘적어봐야겠어 라는 욕심이 요새 올라왓다 

그게 나쁜건 아니지만 블로그외에도 우선 순위라는게 있으니까 


너무 힘빼지말자 !


전체적으로 훅쓰고 나중에 정리해도 괜찮은거같다

보고 또보면 되지뭐 어디 제출해야해서 모든걸 다써야하는것도 아니고 

 글이 어딘가로 슉! 날라가는것도 아니고 


꾸준함이 중요하니까 잘 기록해서 지식으로 남기를!  

너무 무리하지말기!_! 



'개인 > 생각 정리' 카테고리의 다른 글

몰입과 정리  (1) 2023.02.04
꾸준히  (0) 2021.07.22
되돌아보기  (0) 2020.03.04
오늘의 일지  (0) 2018.01.22
C언어 공부 //JAVA 2의보수  (0) 2017.12.04
:
Posted by Gongdile

]저번 포스팅에서 쓰레드(Thread)가 무엇인지에 관해서 설명했다. 

 [JAVA]Thread(쓰레드)- 1.Thread란 무엇일까? 정의,멀티쓰레드와 멀티프로세스

 -->http://gongstudyit.tistory.com/archive/20180515



이번에는 쓰레드를 구현하고 실행하는 방법 그외에 쓰레드의 우선순위, 실행주기등에 대해서 설명하려고한다.


자바에서 스레들르 만들기 위해서는 두가지 작업을 해야한다.

  • 스레드 코드 작성
  • JVM에게 스레드를 생성하여 스레드 코드를 실행 하도록 요청 
--> 자바에서 스레드를 만드는 방법에는 두가지가 있다.

1. Thread 클래스 상속
2. Runnable 인터페이스 구현 

어느 쪽을 선택해도 별 차이는 없지만 
쓰레드 클래스를 상속받으면 다른 클래스를 상속받을 수 없기 때문에 (자바에서는 단일상속만 허용! )
Runnable인터페이스 구현이 일반적이다. 

// 1. Thread클래스를 상속
class MyThread extends Thread{
   public void run() {/* 작업내용   */ }  //Thread클래스의 run( ) 을 오버라이딩
}
// 2. Runnable클래스를 상속
class MyThread implements Runnable{
  public void run() {/*  작업내용 */ } //Runnable인터페이스의 추상메서드 run()을 구현 
}

Runnable 인터페이스는 오로지 run( ) 만 구현되어있는 간단한 인터페이스라서 

구현하기 위해서는 추상메서드인 run의 몸통 { } 을 만들어주면 된다. 


쓰레드 구현하는 2가지 방법의 차이는 

Thread 클래스를 상속받은 경우와 Runnable 인터페이스를 구현한 경우의 인스턴스 생성 방법이 다르다.


아래 예제를 보자 

public class ThreadEx1 {

	public static void main(String[] args) {
		ThreadEx1_1 t1 = new ThreadEx1_1(); //Thread의 자손 클래스 인스턴스 생성
		
		Runnable r = new ThreadEx1_2(); //Runnable을 구현한 클래스의 인스턴스 생성
		Thread t2 = new Thread(r); //생성자 Thread(Runnable target)
		
  //저위의 두줄을 한줄로 간단하게 하려면..r 대신에 new ThreadEx1_2()를 넣으면 된다. 
	        t1.start();
		t2.start();
	}

}
class ThreadEx1_1 extends Thread{
	public void run() {
		for(int i=0; i<3; i++) {
			System.out.println(getName());//조상인 Thread의 getName()을 호출 
		}
	}
}

class ThreadEx1_2 implements Runnable{
	public void run() {
		for(int i=0; i<3; i++) {
			//Thread.currentThread() - 현재 실행중인 Thread를 반환한다. 
			System.out.println(Thread.currentThread().getName());//조상인 Thread의 getName()을 호출 
		}
	}
}
<실행결과>
Thread-0
Thread-0
Thread-0
Thread-1
Thread-1
Thread-1

Runnable인터페이스를 구현한경우, 구현한 클래스의 인스턴스를 생성한 다음에 (위의 r처럼)

이 인스턴스를 Thread클래스의  생성자의 매개변수로 제공해야한다. 


Thread클래스를 상속받으면, 자손 클래스에서 조상인 쓰레드 클레스의 메소드를 직접 호출할수있지만.

Runnable을 구현하면 쓰레드 클래스의 static 메서드인 current Thread( )를 호출하여 쓰레드에 대한 참조를 얻어와야만

호출이 가능하다. 


그래서 위의 예제에 ThreadEx1_2에는 멤버라고는 run( )밖에 없기 때문에

 'Thread.currentThread().getName()'와 같이 해야한다.


  • static Thread currentThread( ) 현재 실행중인 쓰레드의 참조를 반환한다.
  • String getName( )                 쓰레드의 이름을 반환한다. 


<쓰레드의 실행 - start( ) >

start( ) 를 호출해야만 쓰레드가 실행된다. 
start( ) 를 호출했다고 바로 실행되는건 아니고 실행대기에 있다가 자신의 차례가 되어야 실행된다.!

여기서 알아둬야할건 한번 실행이 종료된 쓰레드는 다시 실행할수없다.
즉, 하나의 쓰레드에 대해 start( )가 한 번만 호출될 수 있다. 
그래서 내가 만약 쓰레드의 작업을 한번 더 수행해야 한다면 
 --> 새로운 쓰레드를 생성한다음에 start( ) 를 호출해야한다.

하나의 쓰레드에 대해 start( )를 두번 이상 호출하면 실행시에 IllegalThreadStateException이 발생한다. 

이렇게 에러가 발생!! 


이렇게 만들어줘야한다 

그리고 쓰레드의 이름을 지정하지 않아서 'Thread-번호'의 형식으로 정해져서 콘솔에 출력된건데. 이거 내가 바꿔줄수있다.

다음과같은 생성자나 메서드를 통해서 지정또는 변경할수있다.

Thread(Runnable target, String name)
Thread(String name)
void setName(String name)

아까 위의 코드에서 System.out.println(Thread.currentThread().getName())은 

아래의 코드를 줄여 쓴 것이라고 이해하면 된다. 
Thread t= Thread.currentThread(); //현재 실행중인 쓰레드의 참조를 반환해서 t에 넣는다.
String name= t.getName(); //쓰레드의 이름을 얻어서 name에 넣는다.
System.out.println(name); //name 을 출력한다. 

이렇게 이용할수있다. 


근데 여기서 주의할거는 쓰레드 1, 쓰레드 2가 돌아간다고 가정할때 1,2의 네임을 똑같이 해주면 

어떤 쓰레드가 돌아가고있는지 네임을 얻어서 콘솔창에서 찍을때 알수가없다


 


그러면 스레드1 스레드2의 이름은 다르게하고 스레드1을 두번 실행했을때는 어떨까??

당연한 얘기지만 Thread_Ex3에서 set해준 네임그대로 찍혀나온다.


결론은 

아까 위에서 한쓰레드 대해 start( )가 한번만 호출될수있는데 

만일 쓰레드 작업을 한번더 수행해야할때 새로운 쓰레드를 만들어서 start( )를 호출했는데


그때 

thread -0

thread -1이라고나온건 내가 쓰레드 이름을 설정해주기 않았기때문에 그렇게 나온거라는걸 얘기하고싶었다. 


맨처음 예제에서 쓰레드를 상속받아 구현한것과 러너블 인터페이스를 구현한것도 출력결과가 

thread-0

thread-1이라고 나왔는데 


이것도 이름을 설정해주지 않아서인데 이름을 설정하게되면 다른스레드는 서로 다른이름으로 찍히겠지만, 

같은 쓰레드는 같은 이름으로 나온다는걸 (혼동할수있을거같아서) 설명했다.



<start( )와 run( )>


코드에 start( ) 와 run( ) 이 자주 등장했는데 둘에대해 설명하려고 한다.


main메서드에서 run( )을 호출하는 것은 생성된 쓰레드를 실행시키는게 아니라 

                                                     -->단순히 클래스에 선언된 메서드를 호출하는거다.


반면에 start( )는 새로운 쓰레드가 작업을 실행하는데 필요한 호출스택(call stack)을 생성한 다음에 

                                                     -->run( )을 호출해서, 생성된 호출스택에 run( )이 첫번째로 올라가게 한다.


뭔말이냐?? 면..! 


맨위에 예시처럼 우리가 스레드를 상속받아서 구현시에 run( ) 이라는 메소드를 오버라이딩 했는데 

run( )을 스레드코드 라고부른다. 

스레드는 run( ) 메소드에서부터 실행을 시작하고 run( ) 이 종료하면 스레드도 종료한다.

-->(만약 run( )을 오버라이딩 하지 않으면) Thread클래스의 run( )이 실행되며 Thread의 run( )은 아무일도 하지x 

    단순 리턴하도록 작성되어 있어서 스레드가 바로 종료된다. 


그러니까 쓰레드를 상속받아서 run()이라는 메소드를 오버라이딩해서 스레드 코드를 작성한다. 

그리고 스레드 객체를 생성한거에 생명력을 가지고 실행하게 하는게 바로  start다 !! 



start( )메소드를 호출함으로써 스레드를 동작시킨다. 

(start( )메소드는 Thread클래스에 구현된 메소드이며 개발자가 오버라이딩하면 안된다.)


start( )메소드가 생성된 스레드 객체를 스케줄링이 가능한 상태로 전환하도록 JVM에게 지시를 한다. 

이후 스케줄링에 의해서 그 스레드가 선택되면 비로소 JVM에 의해 run( )메소드가 호출되어 실행을 시작한다.!! 


:
Posted by Gongdile

Thread란 뭘까? 


책에서 스레드 관련 목차를 보면 

1.프로세스와 쓰레드 //그냥 쓰레드랑 멀티쓰레드를 한번에 묶어서 설명한 책도있다.!  

2. 쓰레드의 구현과 실행 

3.싱글쓰레드와 멀티쓰레드 

이후에 쓰레드의 우선순위, 쓰레드의 그룹, 데몬쓰레드 실행제어 동기화등이 설명되어있다.



예전에 한번 블로그에서 동기화에 관해서 앞부분만 설명했는데 오늘은 쓰레드에 관해서 정의나 앞에 전반적인 부분에 대해서 설명하려고 한다. 언어는 볼때마다 기분이 새롭다 ~_~ 




Thread는 한글로 직역하면 '실'이다. 바느질할때 사용하는 ! 

바늘에 실을 꿰어놓으면 오직 그 하나의 실로 하나의 작업을 할 수 있다. 만약에 내가 실로 두가지 바느질을 동시에 하려면 실(thread)가 따로 필요하다.  


컴퓨터 용어로 사용되는 스레드는 실의 의미와 일맥상통한다. 

--> 자바에서 상속부분에서 extends는 확장하다 라는의미인데 조상클래스에서 자식클래스로 갈수록 확장한다는 개념에서 extends라는 단어를 받아들이면 용어가 이해하기 더 쉬운데 스레드도 그런 의미해서 이해하면 더 받아들이기 쉽다. 


컴퓨터에서 사용하는 스레드(thread)는 thread of control의 준말로. 프로그램 코드를 이용하면서 실행하는 하나의 실 

혹은 제어의 개념이다. 아까 말한것처럼. 하나의 실로 하나의 바느질 밖에 할 수 없듯이 하나의 스레드로 하나의 작업밖에 처리할 수 없다. 


쓰레드 부분을 공부하면  프로세스에 대해서도 알고있으면 좋은데.. 


그전에 

프로세스와 프로그램의 차이를 알고있어야한다.

사실 여기서 운영체제(OS) 부분으로 들어가면 프로그램과 프로세스 차이에 대해 더 자세하게 정리할수있지만..

나는 쓰레드에서 프로세스와 프로그램의 차이를 간단하게 집고 넘어갈꺼라 추후에 정리하도록 하겠다.


  • 프로그램(Program) -->실행 가능한 파일
  • 프로세스(Process) -->실행 중인(Running) 프로그램(메모리)


이렇게 프로그램을 --->(실행)하면  --> 프로세스 


프로세스는: 실행중인 프로그램을 말한다. 자원(resources)과 쓰레드로 구성된다. 

쓰레드 : 프로세스 내에서 실제 작업을 수행한다. 모든 프로세스는 하나 이상의 쓰레드를 가지고있다.


쓰레드한마디로 말하자면 실행의 단위이다. 


프로세스가 공장이라면.. 쓰레드는 일꾼이랄까 


모든 프로세스에는 최소한 하나 이상의 쓰레드가 존재한다. 

둘 이상의 쓰레드를 가진 프로세스를 (Multi-threaded process)라고한다. 


하나의 프로세스가 가질 수 있는 쓰레드의 개수는 제한되있지는 않으나. 

쓰레드가 작업을 수행하는데 개별적인 메모리 공간(호출 스택)을 필요로 하기 때문에 

프로세스 메모리 한계에 따라 생성할 수 있는 쓰레드 수가 결정된다.

(근데 실제로 그정도로 많은 쓰레드를 생성하는 일은 없을거다 ㅋㅅㅋ)


멀티프로세스(multi-processing)와 멀티쓰레드(multi-threading)를 비교하자면. 

하나의 새로운 프로세스를 생성하는 것보다 하나의 새로운 쓰레드를 생성하는게 

더 적은 비용이 든다.  그러나 멀티쓰레드도 단점이있다. 그건 아래에 정리하겠다 ! 


---> 멀티프로세스는 하나의 응용프로그램이 여러 개의 프로세스(process)로 구성하여 각 프로세스가 

하나의 작업(task)를 처리하도록 하는 기법이다. 


위에 그림처럼 각 프로세스는 고유한 메모리 영역을 독립적으로 실행된다. 그러므로 하나의 응용프로그램에 속하는 프로세스들조차 상호통신 오버헤드가 크고 프로세스의 문맥교환(context switch)에 따른 과도한 작업량과 시간 소모의 문제점이 있다. (밑줄친 부분을 몰라도 괜찮다. 자바 예제 하는데 지장없다.)


이러한 문제점을 개선하기 위해 제안된 방법이 멀티스레드다!! 


---> 멀티스레드는 하나의 응용프로그램을 여러 개의 스레드로 구성하고 각 스레드로 하여금 하나의 작업을 처리하도록 하는 기법이다.


모든 스레드가 응용프로그램 내의 자원과 메모리를 공유하므로 통신에 따른 오버헤드가 비교적 크지 않고, 스레드 사이의 문맥교환 시에 작업량이 작고 시간이 짧은 장점을 지닌다. 

멀티스레딩시에 운영체제의 스케쥴링 단위가 스레드인셈이다. 


윈도우나 리눅스등 많은 os가 멀티프로세스를 지원하고 있지만 멀티스레드을 기본으로 하고있다. 


멀티쓰레드의 장단점을 얘기하자면 


<장점>

-자원을 보다 효율적으로 사용가능

-사용자에 대한 응답성(response)가 향상

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


--> 여러모로 좋다!


<단점>

-동기화(synchronization)에 주의해야한다. 

-교착상태(dead-lock)가 발생하지 않도록 주의해야 한다.

-각 쓰레드가 효율적으로 고르게 실행될 수 있게 해야하낟.


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

 




우리는 자바에서 스레드로 작동할 코드만 준비하면되고, 스레드의 실행을 책임지는건 JVM이다.

-->자바스레드(java thread)는 JVM에 의해 스케줄되는 실행단위의 코드블록이다. 


자바에서 jvm(자바 가상 머신)은 멀티스레드를 지원하기때문에 자바 응용프로그램은 하나 이상의 스레드를 생성할수있다. 스레드가 생성되면 스레드에 관련된 정보 (Thread Control Block, TCB)가 생성되는데 JVM이 관리한다.


JVM은 (1)한개의 응요프로그램만 실행 가능하다. -->여러개 응용프로그램 실행 불가 X 

    (2)하나의 응용프로그램이 여러 개의 스레드를 가질 수 있다.! 


우리는 이제 이 스레드를 어떻게 사용할지 만드는 방법에 대해서 알고있으면 된다!  구현하는 방법! 





이번 내용을 통해서 내가 결론적으로 말하고싶은건


  • 쓰레드라는건 실행의 단위이고(실!!! ) 

  • 프로세스와 프로그램, 멀티프로세스와 멀티쓰레드의 차이를 알았다는거 !! 

  • 멀티쓰레딩을 이용하여 프로그램 실행시에 장점과 단점이 있기에 고려를 해야한다는점 

  • 그리고 자바에서 스레드의 실행을 책임지는건 JVM이기 때문에 우리는 

    작동시킬 코드만 준비하면 된다는 점이다. 


--> 다음번에는  스레드 구현에 대해서 설명하겠다. 





  


그림 출처: -http://good-dba.tistory.com/9 -->티스토리 

              -자바의정석 PPT 참고 !! 




:
Posted by Gongdile