NOW OR NEVER

[JAVA] Thread 본문

Back-End/JAVA

[JAVA] Thread

LAURA 2022. 4. 13. 17:58
반응형

Thread

  • 쓰레드 : 실행중인 메소드를 쓰레드라고 말한다.

method

  • thread 객체 이름. start() : thread 가동

  • thread 객체 이름. join() : 해당 thread가 끝날 때 까지 기다리도록 한다. 결과값 나타나게 됨

  • 멀티쓰레드

  • 멀티쓰레드 : 두개이상의 메소드를 가능하면 공평하게 실행시키는 프로그래밍 방식을 말한다.

  • 메소드를 호출하면 호출한 순서대로 동작한다. p1.sayHello() 모두 끝나야지만 p2에게 기회가 온다.

  • 만약, p1의 sayHello()를 동작하다가 예외가 발생되면 중지되면 p2에게 영영 기회가 오지 않을 수도 있다.

  • 이때가 가능하면 p1과 p2가 공평하게 어떤 기능을 동작하도록 하게 하려면 멀티쓰레드 방식으로 프로그램 일을 한다.

    class Person{
      String name;  
      public Person(String name) {  
          this.name = name;  
      }  
        public void sayHello() {  
        for(int i=1; i<=10;i++) {  
            System.out.println("Hello,"+name+"! " + i);  
        }  
      }  
    }
    
    public class PersonTest {  
      public static void main(String\[\] args) {  
        Person p1 = new Person("김유신");  
        Person p2 = new Person("홍길동");  
        p1.sayHello();  
        p2.sayHello();  
      }  
    }

자바에 멀티쓰레드 프로그래밍 하기

  • Thread클래스를 상속받아 공평하게 실행시키고 하는 일을 run메소드를 오버라이딩 하여 그 안에 써 준다.

  • start()메소드를 호출하여 가능하면 공평하게 일을 시킨다.

  • 객체를 생성하여 공평하게 일을 시키는 것을 쓰레드를 가동한다라고 한다.

  • Runnable 인터페이스를 구현하는 클래스를 만들고 run메소드를 오버라이딩 하여 그 안에 공평하게 시키고자 하는 명령어들을 써 준다."다중상속"

    class MyBall extends JPanel implmens Runnable{

    }
```
  • 멀티쓰레드로 되어야 한다. 자바는 클래스의 다중상속이 되지 않으므로 이때에는 Runnable인터페이스를 이용한다.
  • 새로 만들려는 이미 있는 다른 클래스로 부터 상속을 받아야 하고 쓰레드를 가동 시키기 위하여 Thread 객체로 포장하여 start()를 호출해야 한다.

쓰레드에 우선순위 설정하기

     setPriority(int newPriority)
     우선순위에 설정할 수 있는 값은 1~10

    public static final int    MAX_PRIORITY    10
    public static final int    MIN_PRIORITY    1
    public static final int    NORM_PRIORITY    5
  • 가능하면 일을 일찍 끝내달라고 요청하는 것이지 우선순위를 높게 설정했다고하여 반드시 그 쓰레드가 작업을 먼저 완료하는 것은 아니다

임계 영역 Critical Section

  • 두 개이상의 쓰레드가 어떠한 변수를 공유하고 있을 때 동시에 두 개의 쓰레드가 접근할 수 없고 한번에 하나의 쓰레드에게만 접근하도록 하는 영역을 칭한다.
  • 임계 영역에 접근하는 메소드에 sychronized 키워드를 붙이면 한번에 하나의 쓰레드만 접근하도록 lock을 걸어준다.

Thread 사이의 통신

  • 쓰레드를 가동하면 가능하면 서로 공평하게 실행이 되게끔 스케쥴링을 해준다. 반드시 공평한 것은 아니다,
  • 만약 공평하게 동작하도록 하려면 쓰레드 사이의 통신이 필요하다.

메소드

  • 기다리고 깨워주는 쓰레드 사이의 통신을 위한 메소드 이용
  • 상대방 쓰레드가 종료될 때까지 내가 기다리고 작업이 끝나면 기다리고 있는 상대방 쓰레드를 깨워준다.
  • Object의 wait 메소드와 notify 메소드 이용
  • wait : 다른 쓰레드가 일을 끝 마칠 때까지 기다림, 예외처리 해줘야 함
  • notify : 기다리고 있던 상대방 쓰레드 깨워줌

Tips

  • 그래픽을 표현하려면 paintcomponent 오버라이딩
  • 움직이는 그래픽을 표현하기 위해서는 thread 사용
  • y좌표는 올라가는 게 감소(-) 내려가는게 증가(+)
  • Thread.sleep(50) -> 0.05초 시간 간격으로 움직임

'Back-End > JAVA' 카테고리의 다른 글

[JAVA] JDBC(Java DataBase Connection Programming)  (0) 2022.04.15
[JAVA] Network Programming  (0) 2022.04.14
[JAVA] GUI(Graphical User Interface)  (0) 2022.04.12
[JAVA] 예외 처리 & Collection  (0) 2022.04.08
[JAVA] 상속성 & 문자열 처리  (0) 2022.04.07
Comments