Java 스레드 생성 방법 및 인스턴스

5200 단어 Java스레드 생성
Java 스레드를 만드는 두 가지 방법
Java는 스레드 클래스Thread를 제공하여 다중 스레드를 만드는 프로그램을 제공합니다.사실, 라인을 만드는 것은 일반적인 클래스를 만드는 대상과 같은 작업이고, 라인을 만드는 것은thread 클래스나 그 하위 클래스의 실례 대상이다.각 Thread 객체는 개별 스레드를 설명합니다.하나의 스레드를 생성하려면 두 가지 방법이 있습니다.
◆ 자바에서lang.Thread 클래스는 새로운 스레드 클래스를 생성하여 run () 방법을 다시 불러옵니다.
◆ Runnalbe 인터페이스를 실현하고 Runnalbe 인터페이스의 run() 방법을 다시 불러옵니다.
왜 Java는 두 가지 방법을 제공하여 스레드를 만들려고 합니까?그것들은 모두 어떤 차이가 있습니까?비교해 보면 어떤 방법이 더 좋을까?
Java에서 클래스는 단일 계승만 지원합니다. 즉, 새로운 클래스를 정의할 때 외부 클래스만 확장할 수 있습니다.이렇게 하면 사용자 정의 루틴 클래스를 만들 때thread 클래스를 확장하는 방법을 통해 이루어진다면 이 사용자 정의 클래스는 다른 클래스를 확장할 수 없고 더욱 복잡한 기능을 실현할 수 없다.따라서 사용자 정의 클래스가 다른 클래스를 확장해야 한다면 Runnable 인터페이스를 실현하는 방법으로 이 클래스를 스레드 클래스로 정의하면 자바 단일 계승이 가져오는 한계를 피할 수 있다.
그리고 가장 중요한 것은 Runnable 인터페이스를 실현하는 방식으로 만든 라인을 사용하여 같은 자원을 처리하여 자원의 공유를 실현하는 것이다.
(1) Thread 클래스 확장을 통해 다중 스레드 생성
한 영화관에 세 개의 매표구가 있다고 가정하면 각각 어린이, 성인, 노인에게 매표한다.영화관은 창구마다 어린이표, 성인표, 노인표 100장을 놓고 있다.세 개의 창구는 동시에 표를 팔아야 하는데, 지금은 한 명의 매표원만 있는데, 이 매표원은 한 개의 CPU에 해당하고, 세 개의 창구는 세 개의 노선에 해당한다.프로그램을 통해 이 세 개의 라인을 어떻게 만드는지 봅시다.

public class MutliThreadDemo {
 public static void main(String [] args){
  MutliThread m1=new MutliThread("Window 1");
  MutliThread m2=new MutliThread("Window 2");
  MutliThread m3=new MutliThread("Window 3");
  m1.start();
  m2.start();
  m3.start();
 }
}
class MutliThread extends Thread{
 private int ticket=100;// 100 
 MutliThread(String name){
  super(name);// 
 }
 public void run(){
  while(ticket>0){
   System.out.println(ticket--+" is saled by "+Thread.currentThread().getName());
  }
 }
}
프로그램에서 스레드 클래스를 정의합니다. 스레드 클래스를 확장합니다.확장된 스레드 클래스를 이용하여 MutliThreadDemo 클래스의 주 방법에 세 개의 스레드 대상을 만들고 start () 방법으로 각각 시작합니다.
그 결과 각 노선은 각각 100장의 영화표에 대응하고 아무런 관계가 없다는 것을 알 수 있다. 이는 각 노선 간에 평등하고 우선순위 관계가 없기 때문에 CPU를 처리할 기회가 있다는 것을 의미한다.그러나 그 결과 이 세 개의 노선은 순서대로 교체하여 집행되는 것이 아니라 세 개의 노선이 동시에 집행되는 상황에서 어떤 노선은 시간편을 분배받을 기회가 많고 표가 앞당겨 매진되는 반면 어떤 노선은 시간편을 분배받을 기회가 비교적 적으며 표가 늦게 매진되는 것으로 나타났다.
이를 통해 알 수 있듯이 확장 Thread 클래스를 이용하여 만든 여러 개의 라인은 같은 코드를 실행하지만 서로 독립적이고 각자의 자원을 가지고 서로 방해하지 않는다.
(2) Runnable 인터페이스를 통해 다중 스레드 생성

public class MutliThreadDemo2 {
 public static void main(String [] args){
  MutliThread m1=new MutliThread("Window 1");
  MutliThread m2=new MutliThread("Window 2");
  MutliThread m3=new MutliThread("Window 3");
  Thread t1=new Thread(m1);
  Thread t2=new Thread(m2);
  Thread t3=new Thread(m3);
  t1.start();
  t2.start();
  t3.start();
 }
}
class MutliThread implements Runnable{
 private int ticket=100;// 100 
 private String name;
 MutliThread(String name){
  this.name=name;
 }
 public void run(){
  while(ticket>0){
   System.out.println(ticket--+" is saled by "+name);
  }
 }
}
이 세 개의 노선도 서로 독립되어 각자의 자원, 즉 100장의 영화표를 가지고 있기 때문에 프로그램 출력의 결과와 (1) 결과는 대동소이하다.모두 각자의 노선이 자신의 표 100장을 단독으로 처리하여 서로 영향을 주지 않는다.
이를 통해 알 수 있듯이 현실적인 상황이 새로운 라인이 서로 독립되고 각자 자원을 가지며 간섭하지 않는다면 어떤 방식으로 다중 라인을 만들 수 있겠는가.이 두 가지 방식으로 만들어진 다중 루틴 프로그램은 같은 기능을 실현할 수 있기 때문이다.
이 세 개의 노선도 서로 독립되어 각자의 자원, 즉 100장의 영화표를 가지고 있기 때문에 프로그램이 출력한 결과와 예4.2.1의 결과는 대동소이하다.모두 각자의 노선이 자신의 표 100장을 단독으로 처리하여 서로 영향을 주지 않는다.
이를 통해 알 수 있듯이 현실적인 상황이 새로운 라인이 서로 독립되고 각자 자원을 가지며 간섭하지 않는다면 어떤 방식으로 다중 라인을 만들 수 있겠는가.이 두 가지 방식으로 만들어진 다중 루틴 프로그램은 같은 기능을 실현할 수 있기 때문이다.
(3) Runnable 인터페이스를 통해 루트 간의 자원 공유를 실현한다
현실에도 이런 상황이 존재한다. 예를 들어 한 기차역의 매표 시스템을 모의한다. 만약에 당일 A지에서 B지로 보내는 기차표가 100장에 불과하고 모든 창구에서 이 100장의 표를 팔 수 있다면 모든 창구도 하나의 노선에 해당한다. 그러나 이때 앞의 예와 다른 점은 모든 노선이 처리하는 자원이 같은 자원, 즉 100장의 차표라는 것이다.만약 아직도 앞의 방식으로 라인을 만드는 것은 분명히 실현할 수 없다면, 이런 상황은 어떻게 처리해야 합니까?아래의 프로그램을 보면 프로그램 코드는 다음과 같다.

public class MutliThreadDemo3 {
 public static void main(String [] args){
  MutliThread m=new MutliThread();
  Thread t1=new Thread(m,"Window 1");
  Thread t2=new Thread(m,"Window 2");
  Thread t3=new Thread(m,"Window 3");
  t1.start();
  t2.start();
  t3.start();
 }
}
class MutliThread implements Runnable{
 private int ticket=100;// 100 
 public void run(){
  while(ticket>0){
   System.out.println(ticket--+" is saled by "+Thread.currentThread().getName());
  }
 }
}
그 결과 앞에서 분석한 바와 같이 프로그램은 메모리에서 하나의 자원만 만들었고, 새로 만든 세 개의 스레드는 모두 이 같은 자원에 접근하는 것을 바탕으로 하였으며, 모든 스레드에서 실행되는 것은 같은 코드이기 때문에 그들이 실행하는 기능도 같다.
이를 통해 알 수 있듯이 현실 문제에서 같은 작업을 수행하기 위해 여러 개의 라인을 만들어야 하고 이 여러 개의 라인 사이에 같은 자원을 공유해야 한다면 Runnable 인터페이스를 실현하는 방식으로 다중 라인 프로그램을 만들 수 있다.이 기능은 Thread 클래스를 확장함으로써 실현할 수 없습니다. 독자들이 생각해 보세요. 왜요?
Runnable 인터페이스를 실현하는 것은 Thread 클래스 확장에 비해 비교할 수 없는 장점이 있다.이런 방식은 프로그램의 건장성에 유리할 뿐만 아니라 코드가 여러 개의 라인에 공유될 수 있을 뿐만 아니라 코드와 데이터 자원이 상대적으로 독립적이어서 같은 코드를 가진 여러 개의 라인에서 같은 자원을 처리하는 상황에 특히 적합하다.이렇게 되면 스레드, 코드와 데이터 자원 세 가지를 효과적으로 분리하여 대상 프로그램 설계를 위한 사상을 잘 나타냈다.따라서 거의 모든 다중 루틴 프로그램은 Runnable 인터페이스를 실현하는 방식으로 이루어진다.
읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기