달력

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

]저번 포스팅에서 쓰레드(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
2018. 5. 15. 14:17

하이라이트 뒷배경 테스트 스터디 2018. 5. 15. 14:17

<p>이제 줄바꿈이 먹을까요?..</p>

<p><br /></p>

<p><br /></p>

<p><br /></p>




줄바굼이 되어라 @제발
String code; 
code="제발 되게 해주세여 테스트 중이에요";

'스터디 ' 카테고리의 다른 글

하이라이트 테스트  (0) 2018.05.15
내가 추후에 올리겠습니다..라고 말한것들  (0) 2018.04.22
:
Posted by Gongdile
2018. 5. 15. 12:10

하이라이트 테스트 스터디 2018. 5. 15. 12:10

테스트를 해보자









@아까는왜 소스가 안먹었을까
public class Highlight{
 String teme;
       teme=obsidian.css;

}




이거 코드 테스트 한건데.. 줄바꿈이 적용이 안된다 자체 배경색상이 다른걸로 덮어버리는데 이거를 해결해야하는데 .!!

일단.. 내용 정리하는게 중요하니까 그건 추후에 


신택스하이라이트가 안먹어서 하이라이트로 적용했다. 


장단점이있는데 무튼 스킨적용은 번거로워 ㅇ_ㅇ 하지만 캡쳐가 더 번거로워서 ㅎㅎ


참고했던 링크를 정리해야겠다..


급하게 적용하느라 이거저것 세세하게 안봣는데 놓친게 분명 있을거다 일단 나중으로 미루고 

줄수길어지는건 캡쳐로 대신하고 간단한거만 적용해야겠다 ㅎㅎ


http://sometimes-n.tistory.com/5 -->이건 신택스하이라이트 설명


'스터디 ' 카테고리의 다른 글

하이라이트 뒷배경 테스트  (0) 2018.05.15
내가 추후에 올리겠습니다..라고 말한것들  (0) 2018.04.22
:
Posted by Gongdile