프로그래밍 정리/자바

Multi Thread(멀티쓰레드)

주누다 2013. 7. 10. 23:54
반응형

Multi Thread?

- Multi-Processing

-> 여러 개의 CPU에서 동시에 여러 개의 프로세스가 수행

-> ex) Dual CPU

- Multi-tasking

-> 하나의 CPU에서 동시에 둘 이상의 작업을 수행

-> ex) 한글을 사용하면서 동시에 웹 브라우저를 실행시킴

- Multi-Threading

-> 하나의 프로세스 내에서 여러 개의 쓰레드가 작업을 수행

-> ex) 스타크래프트를 하면서 정찰과 자원획득, 건물 건축을 동시에 수행

=> 모든 활동들이 하나의 쓰레드로 작동함



- 필요성

-> 동시에 두 가지 이상의 작업을 수행하기 위하여

=> 동시에 for문을 2개 이상 실행해야 할 때

- 문제점

-> 여러 개의 쓰레드가 하나의 자원을 동시에 사용할 때 발생

=> 자료를 동시에 요청할 때 bottleneck 현상 발생

=> 동시사용과 병목현상으로 deadlock 발생

=> 데이터의 무결성에 대한 문제 발생


- 문제 해결책-1

-> 제어적인 측면

=> 우선권(priorith) 부여

=> 수동적인 대책

=> 컴파일러에게 위임

=> 쓰레드의 기본 우선권은 5로 부여됨

=> 프로그래머가 임의로 부여 가능

=> setPriority(int newPriority)로 설정


-> setPriority(int newPriority)

=>  setPriority(int newPriority) : 새로운 우선권을 설정(1-10)

getPriority() : 현재 설정된 우선권을 알아냄

public static fainl int MIN_PRIORITY : 1

public static final int NORM_PRIORITY : 5

public static final int MAX_PRIORITY : 10


- 문제 해결책-2

-> 자료적인 측면

=> 시스템에 미루기

-=> 동기화(synchronized)

-=> 새로운 동기화 방식(Reentrantlock)

=> 프로그래머가 직접 제어

-=> 보다 효율적인 제어를 위해 wait()와 notify()를 사용


===================================================================================================================



public class SoloThread extends Thread{


private int number = 0;

public SoloThread(int n) {

// TODO Auto-generated constructor stub

System.out.println(this.getName());

number = n;

}

@Override

public void run() {

// TODO Auto-generated method stub

int i = 0;

while(i < number){

System.out.print(getName() + ":p:" + this.getPriority() + ":" + i + "\t");

try{

this.sleep(1000);

}catch (Exception e) {

// TODO: handle exception

i++;

}

}

System.out.println("\n" + this.getName() + ":p:" + this.getPriority() + ":쓰레드종료\t");

}

}




public class PriorityThreadMain {

public static void main(String[] args) {
System.out.println("Main 메서드 시작");
System.out.println("Thread.MAX_PRIORITY:" + Thread.MAX_PRIORITY);
System.out.println("Thread.MIN_PRIORITY:" + Thread.MIN_PRIORITY);
System.out.println("Thread.NORM_PRIORITY:" + Thread.NORM_PRIORITY);
for(int i=Thread.MIN_PRIORITY; i<Thread.MAX_PRIORITY + 1; i++){
SoloThread s = new SoloThread(5);
s.setPriority(i);
s.start();
}
System.out.println("Main 메서드 종료");
}
}

=================================================================================================================



Synchronization
- 시스템에 미루기
- 프로그래머가 직접 제어
-> wait()와 notify() 이용

=================================================================================================================


import java.util.Vector;


class SyncStack {
private Vector buffer = new Vector();
public synchronized char pop(){
char c;
c = ( (Character) (buffer.remove(buffer.size()-1))).charValue();
return c;
}
public void push(char c){
synchronized (this) {
Character charObj = new Character(c);
buffer.addElement(charObj);
}
}
}

class PopThread extends Thread{
private SyncStack ss = null;
public PopThread(SyncStack ss) {
// TODO Auto-generated constructor stub
this.ss = ss;
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(this.getName() + " Poping:" + ss.pop() + " OK");
}
}



class PutThread extends Thread{
private char c;
private SyncStack ss = null;
public PutThread(SyncStack ss, char c) {
// TODO Auto-generated constructor stub
this.ss = ss;
this.c = c;
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(this.getName() + " Putting Char:" + c);
ss.push(c);
}
}

public class SyncThreadMain {

public static void main(String[] args) {
System.out.println("Starting SyncTest...");
SyncStack ss = new SyncStack();
for(int i=0; i<10; i++)
new PutThread(ss, (char)(i+33)).start();
for(int j=0; j<10; j++)
new PopThread(ss).start();
}
}

==============================================================================================================


반응형