728x90

운영체제는 두가지 이상의 작업을 동시에 처리하는 멀티 테스킹을 할 수 있도록
CPU 및 메모리 자원을 프로세스마다 적절히 할당해주고 병렬로 실행시킨다.
예를 들어 워드로 문서작업을 하면서 '동시에' 미디어 플레이어로 음악을 들을 수 있다.

운영체제만이 아닌 하나의 어플, 프로그램도 멀티테스킹을 할 수 있다. 영상과 음악이 같이 나오는 미디어플레이어나
채팅을 하면서 파일도 전송하는 메신저가 그 예다. 
이런 동작을 멀치 스레드라고 한다

스레드는 하나의 코드 실행 흐름이다.

자바의 모든 애플리케이션은 메인스레드가 main()메소드를 실행하면서 시작한다.
우리가 간단하게 메인메소드에 System.out.println("Hello World")를 출력하는것도 하나의 스레드이다.

대략 그림으로 표현하면 이렇게된다. 스레드는 만들기 나름이다...


용어

테스크(Task)는 일 혹은 작업이라고 하며 프로세스와 스레드 까지 의미한다.

프로세스(Process)는 OS로부터 자원을 할당받아 동작하는 독립된 프로그램을 의미한다.

스레드(Thread)는 하나의 프로세스에서 실행하는 작업의 단위다.

멀티 태스킹은 여러개의 태스크 즉 일을 병렬처리 하는 것을 의미한다.

멀티 프로세싱은 여러개의 CPU 프로세스가 서로 협력하여 작업을 병행처리하는 기법이다.

멀티 스레딩은 하나의 프로그램(프로세스)에서 여러 개의 스레드가 실행되는 것을 의미한다.


스레드를 생성하기 위해선 Thread클래스와 Runnable 인터페이스가 필요하다

Thread 객체를 만들고 start()메소드를 실행하면 간단히 새로운 실행 흐름이 생성된다.
하지만 위에서 생선한 Thread 객체는 아무 동작도 하지 않기 때문에 아무런 결과를 얻을 수 없다.
즉, 아무일도 하지 않는 스레드가 생성되고 바로 소멸된 것이다.

작업을 수행하는 스레드를 만들기 위해서는 Thread 클래스의 run()메소드를 오버라이딩 해야한다.
run()메소드는 새로운 실행 흐름에서 수행한 작업이 정의된다.

위의 사진 play2는 첫번째와 달리 메세지를 출력한다. 
아래꺼는 Thread를 상속받고있고 run()메소드를 오버라이딩해서 새로운 일을 하도록 재정의했다.

Play3 클래스를 보면 Thread 객체 t의 start()메소드를 실행한 것을 볼 수 있다.
스레드를 실행하기 위해서는 스레드 객체를 생성하고 start()메소드를 호출해야 한다.

Thread클래스를 상속한 Play2 클래스의 경우 그 자체가 Thread클래스다

반면 인터페이스를 구현한 Play3 클래스의 경우 객체r을 인자로 넘긴다. 이떄 스레드 객체는 생성되었지만 start()메소드를 호출하기 전까지 아무 일도 일어나지 않는다. start()메소드를 호출해야 실행된다.

Play2와 Play3에서 사용한 구현 방식의 동작은 동일하다.
자바는 단일 상속만 가능하므로 상속을 한경우 확장성이 떨어진다.
반면 인터페이스를 구현한 경우 다형성 측면에서 유리하다. 즉 재사용 및 확장에 좋다.


스레드는 내가 동작하고 싶은 곳에 선언하면 된다.

타이머 클래스의 경우 메인메소드가 실행되는 도중에(윈도우창) 타이머를 동작할 거니까
마우스로 버튼을 누르는 동작에서 스레드를 발생시면되고 

스탑버튼을 누르는곳에선 스레드가 시작이 아닌 끝나는 t에다 null값을 넣으면 된다.


 

이 클래스같은 경우에는 버튼을 마우스로 '누르고 있으면' 동작해야 하니까 mousePressed에 스레드를 구현하고
버튼을 '떼는' 동작 mouseReleased에 스레드t를 제거하기위해 null을 선언

728x90

'JAVA' 카테고리의 다른 글

10/19 수업  (0) 2020.10.19
10/16 수업내용  (0) 2020.10.16
10/15 수업내용(타이머,  (0) 2020.10.15
팩맨 움직이기1  (0) 2020.10.14
10/14 수업  (0) 2020.10.14

+ Recent posts