Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

붓, 그리다

쓰레드 본문

JAVA/Basic

쓰레드

붓그린 2017. 6. 16. 17:14
[ 프로세스와 쓰레드 ] p

1) 쓰레드는 프로세스와 연관지어 나온다.
2) 프로세스 : 실행 중인 프로그램
- Foregroud Process

- Background Process


3) 쓰레드
- 응용프로그램 내에서 실행되는 최소 실행 단위
- 프로레스 자원을 이용해서 실제로 작업을 수행하는 것
- 데이터를 공유해서 작업 => 동기화 작업과 연관



EX) 웹 브라우져
- 특정 사이트에 접속하여 홈페이지를 보여주는 프로그램
1) 먼저 접속을 시켜주는 쓰레드가 존재
2) 홈페이지를 보여주는 쓰레드
3) 동영상, 문자, 데이터 등을 보여주는 쓰레드
=> 하나의 프로그램에는 여러개의 쓰레드가 존재할 수 있다.


[ 싱글 쓰레드와 멀티 쓰레드 ]
1) 싱글 쓰레드
2) 멀티 쓰레드
- 쓰레드가 여러개가 작동
- CPU 사용률을 향상
- 자원을 보다 효율적으로 사용
- 사용자에 대한 응답성이 향상 => 메모리를 적게 사용(메모리 절약)
- 작업이 분리되어 코드가 간결


* 웹프로그래밍
- JSP(홈페이지 작성)
- 서버 필요(톰캣서버) : 다양한 요청을 처리=>쓰레드 단위로 요청을 처리






[ 쓰레드의 작성 순서 ]
1) Thread 클래스를 상속받는다.
2) run() 메서드를 작성 (쓰레드의 기능을 작성한다.)
3) 쓰레드 객체를 생성
4) start() 메서드를 호출한다.



*상속을 사용하는 목적
- 코드 절약, 개발단축
- 기능을 구현하기 위해 (Thread 클래스)


1) Thread 클래스를 상속받으면 쓰레드 기능을 사용 할 수 있다.
- 오버라이딩을 하기 위해 상속을 받는다.

*) run() :
- 실시간으로 데이터를 보여주는 기능
- 데이터를 출력, 계산, 저장,,,
- Thread클래스에 있음

*) strat()
- 내부적으로 run()실행



EX) Threas 클래스를 상속받는 방법 

package j0616;

// 1.Thread 클래스를 상속받으면 쓰레드 기능을 사용할 수 있다.
public class MultiThread extends Thread {

        // 쓰레드 이름 : 생성자
        public MultiThread(String s) {
                //this.setName(s); //쓰레드의 이름을 부여<-> getName();
                super(s);
        }


        @Override // Thread 클래스가 가지고 있음, 실시간으로 데이터를 보여주는 기능
        public void run() {
                // TODO Auto-generated method stub
                //소문자를 출력시키는 기능
                for(char i='a';i<='z';i++) {
                        try {
                        Thread.sleep(500); // 호출 속도조절, InterruptedException 예외처리
                        //sleep(1000) = 1초동안 정지
                        System.out.println(i);
                        System.out.println("쓰레드의 이름 : "+this.getName()); // this=mt
                        }catch(Exception e) {e.printStackTrace();}
                }
        }

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                MultiThread mt=new MultiThread("임시"); // 다른 생성자가 있을 경우 기본 생성자가 만들어지지 않는다.
                mt.start(); // 내부적으로 run() 메서드 호출
        }

}





[ Runnable 인터페이스를 상속받는 방법 ]

- Thread 클래스를 상속 받을 수 없는 경우 
1) Raunnable 인터페이스를 상속받는 자식 클래스를 작성
2) Thread 클래스의 객체를 생성
3) Thread 클래스의 객체를 생성할 때 생성자의 인수로서 Runnable 인터페이스를 상속받은 자식클래스의 객체를 매개변수로 넘겨준다


package j0616;

import java.io.BufferedReader;
import java.io.*;

public class MultiThread2 {

        public static void main(String[] args) throws Exception {
                // TODO Auto-generated method stub
                // 1) Runnable 인터페이스를 상속받은 자식클래스 객체생성
                System.out.println("실행시킬 단을 입력하세요");
                BufferedReader br=new BufferedReader
                                (new InputStreamReader(System.in));
                int dan=Integer.parseInt(br.readLine());
                GooGoo go=new GooGoo(dan);

                // 2) Thread 클래스 객체 생성 -> 생성자 인수로서 Runnable 인터페이스를 상속받은 자식클래스를 넣어줌
                Thread t=new Thread(go);

                // 3) Thread 클래스 객채를 호출
                t.start();
        }

}

// 2) 구구단을 출력 : Rannable 인터페이스를 상속
class GooGoo implements Runnable{
        private int dan;
        public GooGoo(int dan) {
                this.dan=dan;
        }

        // 인터페이스한 추상 메서드 오버라이딩
        @Override
        public void run() {
                // TODO Auto-generated method stub
                for(int i=1; i<=9; i++) {
                        try {
                                Thread.sleep(500);
                                System.out.println(dan+"단 : "+dan+"*"+i+"="+(dan+i));
                        }catch(Exception e) {System.out.println(e);}
                } //for
        }

}



[ 쓰레드의 우선순위 ] p.738
- 한개 이상의 쓰레드를 가지고 있을 경우 어느 특정한 쓰레드를 우선적으로 실행...
- 쓰레드는 우선순위(priority)라는 속성(멤버변수)을 가지고 있다
- 이 우선순위의 값에 따라 쓰레드가 얻는 실행시간이 달라진다
- 1~5~10 => 멤버변수로 제공, 1(최소우선순위), 5(보통우선숭위), 10(최대우선순위)


package j0616;

import java.io.BufferedReader;
import java.io.*;

public class MultiThread2 {

        public static void main(String[] args) throws Exception {
                // TODO Auto-generated method stub
                // 1) Runnable 인터페이스를 상속받은 자식클래스 객체생성
                GooGoo go=new GooGoo(4);
                // 2) Thread 클래스 객체 생성 -> 생성자 인수로서 Runnable 인터페이스를 상속받은 자식클래스를 넣어줌
                Thread t=new Thread(go);
                // 3) Thread 클래스 객채를 호출
                //t.start();

                // 2번째 Thread 생성 실행
                PrintThread pt=new PrintThread();
                // 우선순위를 정해준다 : setPriority(우선순위숫자);
                t.setPriority(10);
                pt.setPriority(Thread.MIN_PRIORITY); // 1
                t.start(); pt.start();

        }

}

// 2) 구구단을 출력 : Rannable 인터페이스를 상속
class GooGoo implements Runnable{
        private int dan;
        public GooGoo(int dan) {
                this.dan=dan;
        }

        // 인터페이스한 추상 메서드 오버라이딩
        @Override
        public void run() {
                // TODO Auto-generated method stub
                for(int i=1; i<=9; i++) {
                        try {
                                Thread.sleep(500);
                                System.out.println(dan+"단 : "+dan+"*"+i+"="+(dan+i));
                        }catch(Exception e) {System.out.println(e);}
                } //for
        }

}

// 1) 임의의 숫자를 속도 조절하면서 출력
class PrintThread extends Thread{
        @Override
        public void run() {
                // TODO Auto-generated method stub
                for(int i=1;i<=9;i++) {
                        try {
                                //임의의 숫자를 만드는 방법(난수 생성) : 0~0.99999
                                //Math.random()
                                long sleeptime=(int)(Math.random()*500+1);
                                Thread.sleep(sleeptime);
                                System.out.println("i="+i);
                        }catch(Exception e) {System.out.println(e);}
                }//for
        }
}





[ strat()와 run()의 차이점 ]

1) strat()
- main()을 먼저 실행하고 start()을 실행
- 기존 main쓰레드를 유지가 되면서 다른 쓰레드를 가동

2) run()
- main()이 run()을 만나면 멈추고 run()을 실행
- 기존의 main 쓰레드가 멈춘 상태에서 다른 쓰레드를 가동
- 안정성의 문제가 발생할 수 있음
- 성능에 영향을 미친다(secode coding)

=> 반드시 strat()를 쓴다

package j0616;
// strat()와 run()의 차이점
public class MyThread implements Runnable{

        @Override
        public void run() {
                // TODO Auto-generated method stub
                while(true) {
                        System.out.println("is Runnig");
                        try {
                                Thread.sleep(1000); // 1초
                        }catch(Exception e) {System.out.println(e);}
                }//while
        }

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                MyThread my=new MyThread();
                Thread t=new Thread(my);
                //t.start(); // main() 실행 후 start() 실행
                t.run(); // maim()이 run()을 만나면 멈춰버리고 run()을 실행
                System.out.println("MainThread Terminated!");
        }

}









'JAVA > Basic' 카테고리의 다른 글

쓰레드 2 (동기화, Singleton)  (0) 2017.06.19
상속, 오버라이딩  (0) 2017.06.16
입출력(직렬화)  (0) 2017.06.16
입출력(스트림) 2  (0) 2017.06.16
입출력(스트림) 1  (0) 2017.06.16
Comments