본문 바로가기

IT일반과목/java

쓰레드2 (학원수업)

20180810

- Thread

 -> 프로세스

  -> 실행중인프로그램

  -> OS으로부터 실제 메모리를 할당받아  실행중인 상태

  -> 프로그램 실행하는데에 필요한 데이터 + 메모리 + 쓰레드

     3개가 합쳐져 있다.


# 쓰레드

 -> 프로세스가 일을처리하는 최소 작업단위

 -> (간단하게) 실행의 흐름단위

 -> cpu가 실행을 요청순서에 따라서 순서결정

 -> FIFO 구조이다. (First In First Out)

 -> 쓰레드가 1개 있다는것(싱글 쓰레드)

  -> 한번에 하나의 작업만 가능(메세지를 보내거나 기다리거나)


 -> 멀티스레드로 만들경우 여러가지일을 다중적으로 처리할 수 있다.


멀티쓰레드(쓰레드가 여러개)

 -> 동시에 여러가지 작업이 가능

 -> CPU사용률을 향상

 -> 자원을 보다 효율적으로 사용함

 -> 사용자에 대한 응답성이 향상 (동시에 메세지를 주고받을수 있다.)

 -> 코드 분리가능(읽어오는 코드, 쓰는 코드)


멀티쓰레드 주의사항

 -> 동기화, 교착상태

동기화 -> 독립적인 2개이상의 개체를 연결 -> 1:N관계

교착상태 -> 두 쓰레드가 자원을 점유한 상태에서 상대편이 점유한 자원을 사용하려고 기다리느


라 진행이 멈춰 있는 상태 -> 1:1관계


그동안 한개의 쓰레드로 계속 실행

 -> 실행클래스 -> main() -> main쓰레드


멀티스레드하는경우 작성

1. Thread 클래스 상속 받아야 한다. -> 자바에서는 상속이 하나밖에 안되었다.

 -> Runnalbe라는 인터페이스를 상속하면 된다.

(상속이 되있는 클래스라고 하면 Runnable 인터페이스를 상속받으면 된다.


2. run()메소드를 오버라이딩 해야된다.

 -> 실행에 필요한 코드를 작성하면 된다.


Thread를 상속받으면 run()메소드를 @Override해야한다.


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

먼저 들어온걸 동기화라고 한다.(synchronized )

객체가 하나이고 쓰레드가 접속을 둘이 해서 둘다 쓸려고 해서 그런다.

동기화를 쓸경우 하나가 끝날때까지 기다린후 그후 다음께 실행된다. 같이실행이안된다.

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

StringBuffer

-> 쓰레드세이프 지원

StringBuilder

-> 쓰레드 세이프 지원하지 않는다.


쓰레드 safe = 쓰레드 synchronized 이거다.


쓰레드 버퍼로 만들어진 녀석은 lock를 가질수 있는데 이거있는 사람한테만 쓰게 할꺼야

StringBuilder은 lock를 가질수없어서 synchronized를 쓸 수 없다.







package jongkyu.start;


public class Start {

public static void main(String[] args) {

// Test1 t1 = new Test1(); //Thread 상속

// Test2 t2 = new Test2(); //Runnable 상속

// //쓰고싶은 멀티쓰레드 객체를 만들었다.

// Thread th1 = t1; //Thread 상속의 경우 생략 가능

// //Thread th2 = t2; //이렇게 해버리면 안된다. -> Thread th1은 t1을 상속받았다. 다형성이 적용되어있다. th1은 부모 t1은자식클래스이다.

// //얘는 상속받은 녀석이 아니기 때문에 사용을 할려면

// Thread th2 = new Thread(t2);//->이렇게 써줘야 한다.

// th1.setPriority(10);//1~10사이의 숫자 넣어주면 된다.//10이우선순위가높다.

// th2.setPriority(1);//우선순위가 낮다.

// //Priority는 가중치이다.

// th1.start();

// th2.start(); //쓰레드의 호출을 할때는 쓰레드를 호출해야한다.

// //여기까지면 쓰레드를 3개쓰는것이다. 우리가 작성한거 2개랑 main까지 하는것이다.

// try {

// //th1.join();//join의 의미는 th1이라는 쓰레드가 종료될때까지 기다린다.

// th2.join(3000);//기다리는데 3초만기다리고 실행할꺼야..

// //아무것도 안넣으면 끝날때까지고 넣으면 그 시간만큼만 기다린다.

// //th1.interrupt(); //인터럽트는 쓰레드를 강제로 중지시킬때 사용

// System.out.println("메인쓰레드 실행테스트");

// } catch (InterruptedException e) {

// // TODO Auto-generated catch block

// e.printStackTrace();

// }


//System.out.println("=====================================");

Table t = new Table();

//밑에 Table을 통해 t라는 걸 만들었다.

MyThread1 t1 = new MyThread1(t);

MyThread2 t2 = new MyThread2(t);

//이렇게 하면 main에서 Table객체를 만들었고

//만들어지고나서 쓰레드2개를 만들려고 쓴것인데

//각각 같은 녀석을 참조하고 있다.

t1.start();

t2.start();//쓰레드를 상속한경우일반 객체만들듯이 쓰면 된다.

//start라는 녀석은 주소값을 찾아가고 거기에 있는 dataPrint메소드를쓸거야

//결론적으로는 Table라는 t의 객체가 똑같다.



}

}


class Table{

public synchronized void dataPrint(int n) {

//synchronized를 쓸경우 하나가 끝날때까지 접속이 안된다는 것이다.

for(int i=1; i<=5; i++) {

System.out.println(n+"X"+i+"="+n*i);//매개변수 받아서 1부터 9까지 곱하는것

try {

Thread.sleep(500);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}//0.5초이다.


}

}

}


class MyThread1 extends Thread{

Table t;

public MyThread1(Table t) {

this.t = t;


}

public void run() {

t.dataPrint(5);

}

}


class MyThread2 extends Thread{

Table t;

public MyThread2(Table t) {

this.t = t;

}//생성자


public void run() {

t.dataPrint(100);

}

}


'IT일반과목 > java' 카테고리의 다른 글

자바 네트워크 TCP통신 문제 맞추기  (0) 2018.08.12
자바 네트워크 다중접속 과제  (2) 2018.08.12
쓰레드1 (학원수업)  (0) 2018.08.10
네트워크 수업3 (야구게임) (과제)  (0) 2018.08.09
네트워크 수업2  (0) 2018.08.09