카테고리 없음

롤로 코딩하기 .thread

까마귀코딩 2023. 3. 13. 14:19

Java 에서 쓰레드란 무엇일까 ? 

예제와 사용하는 이유를 알아보자 !!

 

 

 

기존 자바에서는 

 

Ahri.maeHok();

Ahri.spritRush(); 

 

 

이렇게 코드 두줄이 있다고 하면 ?? 

 

 

순서대로 Ahri.maeHok(); 를 수행하고 난 다음에,

Ahri.spritRush(); 를 수행하게 된다.

 

그러니까 즉 순서대로 위의 코드를 수행해야 아래코드를 수행할수 있다는 뜻이다. 

 

 

그런데 만약 

쓰레드를 사용한다??? 하면은

 

Ahri.maeHok();을 수행하고나서 그것이 끝나지 않은 상황에서

바로 Ahri.spritRush(); 를 수행하면서 아래코드를 계속 수행하게 된다. 

 

 

그 말은

위 코드의 수행완료 여부와 상관없이  계 속 코드를 수행한다는 뜻이다. 

 

 

쓰레드를 쓰기전의 코드는  ?? 

스킬이 끝나기 전까지는 움직이지도 못하고 다른스킬도 사용할수 없다 !!  ---> 한줄이 완전히 끝나야 다음줄로 넘어감 !

 

그렇지만 쓰레드를 쓰고 난 후의 코드는 ??

 

동시에 여러개 스킬 사용 샵가능~

 

 

결국!

 쓰레드 사용시 좋은점은

간단하게 

 

한번에 여러스킬을 수행할수 있다는것 !!!

== 여러 기능을 동시수행 가능하다 ~!~!^^

 

 

 

 

 

코드로 확인해보자 

 


쓰레드 사용 전 코드


public class Ahri {
 String skill_name;
 
 public Ahri(String click) {
  skill_name = click;   // 요게 생성자 이다 !
 }
 
 public void run(){
  System.out.pringln(" 아리가 시전한 스킬은 : " + skill_name);
  
  for( int i = 1; i<=3; i++) {
     System.out.println(skill_name +"스킬을" + i + "초간 시전중입니다. ..."); 
   }
     System.out.println(" 시전 끝난 스킬은 : " skill_name);
  }
  
  public static void main(Stirng[ args) {
   String[] click = new String[] {"q","w","e"}; // q,w,e 순서이다. 
   
   for(int i = 0; i<click.length; i+){
     Ahri yeowoo = new Ahri(click[i]); // 객체화 !
     yeowoo.run(); // 아리의 run 메소드를 실행시켜 !
  }
}

실행시키면  console창에 어떻게 나올까 ???

 

 

console:

아리가 시전한 스킬은 : q

q 스킬을 1초간 시전중입니다. ...
q 스킬을 2초간 시전중입니다. ...
q 스킬을 3초간 시전중입니다. ...
시전 끝난 스킬은 : q
아리가 시전한 스킬은 : w
w 스킬을 1초간 시전중입니다. ...
w 스킬을 2초간 시전중입니다. ...
w 스킬을 3초간 시전중입니다. ...
시전 끝난 스킬은 : w
아리가 시전한 스킬은 : e
e 스킬을 1초간 시전중입니다. ...
e 스킬을 2초간 시전중입니다. ...
e 스킬을 3초간 시전중입니다. ...
시전 끝난 스킬은 : e

 

쓰레드를 사용하지 않은 코드에서

 

String 타입의 배열 click 에 q,w,e 를 각각 넣어주고 

Ahri 아리를 객체화 한뒤에

run() 메소드를 실행해주니 

순서대로 q,w,e 순서대로 코드가 진행되는 것이 보인다. 

 

 

 

그러면 쓰레드를 사용해 보자 1!!

 

public class Ahri extends Thread{
 String skill_name;
 
 public Ahri(String click) { //생성자
   skill_name = click;
 }
 
 public void run() { // start() 메소드 사용시
  Sytem.out.prinln ( " 시전한거 ? : " + skill_name);
  
  for(int i = 1; i<=3; i++) {
    System.out.println(skill_name + "스킬을" + i + "초간 시전중 입니다...");
  }
  System.out.println("시전끝난거? : " + skill_name);
 }
 public static void main(String[] args) {
 String[] click = new String[] {"q","w","e"};
 
  for(int i =0; i<click.length; i++) {
  Ahri a = new Ahri(click[i]);
  a.start(); // extends Thread 후에 start() 메소드 사용시 run() 메소드를 수행하게 된다. 
  }
 }
}

 

시전한거 : q

시전한거 : w

시전한거: e

e스킬을 1초간 시전중입니다...

q스킬을 1초간 시전중입니다...

e스킬을 2초간 시전중입니다...

w스킬을 1초간 시전중입니다...

w스킬을 2초간 시전중입니다...

w스킬을 3초간 시전중입니다...

e스킬을 1초간 시전중입니다...

q스킬을 2초간 시전중입니다...

q스킬을 3초간 시전중입니다...

시전한거 : w

시전한거: e

e스킬을 1초간 시전중입니다...

시전한거: q

q스킬을 3초간 시전중입니다...

 

다음은 쓰레드를 사용하는 아리클래스 인데 

여기서 스레드를 사용하기 위해서는 

 

방법은 2개 !

 

1. extends Thread 혹은

2. implements Runnable 을 통해 사용할수 있다. 

둘의 차이는 나중에 공부하기 ~

 

 

지금은 1번.extends Thread 를 통해 사용하도록 하자 

 

보면 거의 동일한 코드데 다른점은 ??

Thread 는 상속받고 ,

start() 메소드를 수행시 RUN() 메소드를 수행한다는 차이가 있다. 

 

여기서 실행된 코드를 보면 

 

a.start 는 순서대로 수행하되 

RUN()은 들어오는 순서대로가 아닌 동시에 수행되는것이 보인다. 

 

이제 쓰레드가 감이 올텐데 

쓰레드를 사용하면 위코드의 수행완료 여부와 상관없이 들어오는 족족 계쏙 코드를 수행하게 된다. 

 

 

그렇다면 쓰레드를 사용하는 이유는 뭘까 ? ? ? ? ? 

쓰레드를 사용하면 동시에 여러개의 코드를 수행할수 있으므로 

동시에 엄청난 양이 들어오는 채팅서비스나 공장의 경우에는 하나씩 처리하면 엄청난 시간이 걸리기 때문에 

쓰레드를 사용하여 많은 양도 한번에 처리할수 있다. 

 

다만 쓰레드를 사용시 주의할점이자 단점은 쓰레드로 한번에 많은 코드들을 수행할수록

 

컴퓨터에 부하가 심해진다 !!

쓰레드 수행도중 내게 필요한 자원을 남이 가지고 있고 

남은 남에게 필요한 자원을 내가 가지고 있어서 서로 무한정 대기하는 교착상태 ( 데드락 ) 문제가 있으므로 

이에 주의해야 한다. !!!