프로세스와 스레드, run(), start(), Vector와 ArrayList의 Thread 차이, Synchronized, 동기화 처리, 동기화 블록, 임예값, 임계영역, extends Thread, implements Runnable

2019. 3. 28. 19:41JAVA

------------------------프로세스와 스레드-----------------------------

프로세스란
 프로그램들은 실행 될때마다 프로세스가 실행된다.
보통은 하나의 프로그램은 하나의 프로세스가 실행된다.


멀티테스킹이란 
한번에 동시에 두개 이상의 프로세스(프로그램)를 처리하는것을 말한다.


스레드란
프로그램에서 사용되는 역할, 기능, 작업을 말한다. 그리고 하나의 스레드를 메인스레드라 한다.


멀티 스레드란
하나의 프로세스(프로그램)에서 동시에 두개 이상의 스레드를 사용하는것을 멀티스레드라 한다.
(스레드간에 서로 간섭하지않고 실행한다)
예시) 메신저에서 파일을 보내면서 채팅하는것, 멜론에서 음악을 들으면서 앨범을 찾는것



주요 메소드
.run()
실행될 작업을 명시한다.

.start()
메소드들의 run()을 동시(번갈아 가며)에 시작이 된다.


스레드 만드는 방법
1. )-------------------------------------------------------
public class MyThread extends Thread {
public void run() {
// 수행할 작업
}
}

MyThread t = new MyThread();
t.start();


사용이유

2.)-------------------------------------------------------
public class MyRunnable implements Runnable {
public void run() {
// 수행할 작업
}
}

MyRunnable my = new MyRunnable();
Thread t= new Thread(my);
t.start();


사용이유 
1. 이미 다른 클래스를 상속받았을경우 Tread를 상속받지 못하기 때문에 사용



예시)
MyThread.java-------------------------------




 
YourThread.java-----------------------------





ThreadApp.java-----------------------------




=============Vector와 ArrayList의 Thread 차이================
Vector와 ArrayList는 같은것이다. 그렇지만 Thread에서 좀 다르다.

Vector는 ThreadSafe
// 동기화 처리된 메소드
Vector의 add에는 
public Synchronized boolean add(E e){
저장소의 크기를 확인
크기 조절
저장
}
// 동기화 처리된 메소드는 특벙 스레드가 이 메소드를 실행할 째 항상
// 메소드내의 모든 수행문을 실행하고 빠져나간다.


ArrayList는 ThreadUnSafe 하다.
ArrayList의 add
public boolean add(E e){
저장소의 크기를 확인
크기 조절
저장
}
// 동기와 처리되지 않은 메소드는 특정 스레드가 이메소드를 실행할 때
// 수행문의 밀부분만 실행하고 실행제어권이 다른 스레드로 넘어갈 수 있다.


Vector 는 자동으로 동기화를 보장함으로써 복수의 스레드로부터 추가/삭제 이루어 지더라도 
내부의 데이터 처리는 안전하게 한번에 하나의 스레드만 처리되도록 보장함으로써 데이터 처리의 안정화의 이점이 있음.

하지만 단일 스레드 처리시에는 자동 동기화 보장이 오히려 성능의 저하를 일으킬수 있기 때문에 
단일 처리상에서는 ArrayList 가 더 효율적인 성능을 보장.

동기화 처리를 위해서는 Vector 의 사용보다는 ArrayList 의 동기화처리로 구현하는것이 더욱 바람직함

* ArrayList 동기화 지원 방법
List list = Collections.synchronizedList(new ArrayList());  // Vector와 동일한 클래스



예시) Vector일때----------------
ListRunnable.java


ListRunnableApp.java





예시) ArrayList일때--------------
ListRunnable.java


ListRunnableApp.java







===========synchronized(동기화 처리), 임계값 임계영역 지정=============
synchronized(동기화 처리) 란
동기화 처리를 안할경우 중간에 끼어들어 왔다갔다 하지만 synchronized를 쓰면 임계영역이 지정되어 하나씩 된다.



예시)
 ATM.java



위의 것을 아래처럼 synchronized를 붙여 동기화 처리하면 





ATMAPP.java




+
public Synchonized void 출금() { // 동기화처리된 메소드
카드 정보 확인
서비스 선택
비밀번호 확인

잔액확인
출금 처리

현금제공
}
이런식으로 하면 잔액확인 및 출금처리 뿐만 아니라 다른 기능을 모두 한명 씩밖에 못하지만


public void 출금(){
카드 정보 확인
서비스 선택
비밀번호 확인

synchronized(this){ // 동기화 블록
잔액확인
출금처리
}

현금 제공
}
위처럼 임계블록을 이용하면 실질적인 출금(값을 변경하는 부분)만 임계영역으로 하여 
다른 기능들은 자유롭게 이용할수 있으며 실행속도나 성능이 좀 더 좋다.