>  기사  >  Java  >  Java에서 스레드를 생성하기 위한 두 가지 방법의 예제 코드 공유

Java에서 스레드를 생성하기 위한 두 가지 방법의 예제 코드 공유

黄舟
黄舟원래의
2017-03-17 10:48:591370검색

이 글에서는 주로 자바에서 쓰레드를 생성하는 두 가지 방법과 관련 예시를 소개하고 있습니다. 도움이 필요한 친구들은

자바에서 쓰레드를 생성하는 두 가지 방법

Java는 다중 스레드 프로그램을 생성하기 위한 스레드 클래스 Thread를 제공합니다. 실제로 스레드를 생성하는 작업은 일반 클래스 객체를 생성하는 것과 동일하며 스레드는 Thread 클래스 또는 그 하위 클래스의 인스턴스 객체입니다. 각 Thread 개체는 별도의 스레드를 설명합니다. 스레드를 생성하려면 두 가지 메소드가 있습니다.

◆ Java.lang.Thread 클래스에서 새 스레드 클래스를 파생시키고 해당 run() 메소드를 오버로드해야 합니다.


◆Runnalbe

인터페이스를 구현하고 Runnalbe 인터페이스에 run() 메서드를 오버로드합니다.

Java가 스레드를 생성하는 두 가지 방법을 제공하는 이유는 무엇입니까? 그들 사이의 차이점은 무엇입니까? 이에 비해 어떤 방법이 더 나은가요?

Java에서 클래스는 단일 상속만 지원합니다. 즉, 새 클래스를 정의할 때 하나의 외부 클래스만 확장할 수 있습니다. 이런 식으로 사용자 정의 스레드 클래스를 생성하면 다음과 같이 구현됩니다. Thread 클래스의 메서드를 확장하므로 이 사용자 정의 클래스는 다른 클래스를 확장할 수 없으며 더 복잡한 기능을 구현할 수 없습니다. 따라서 사용자 정의 클래스가 다른 클래스를 확장해야 하는 경우 Runnable 인터페이스를 구현하는 메소드를 사용하여 해당 클래스를 스레드 클래스로 정의하면 Java 단일 상속의 제한을 피할 수 있습니다.

가장 중요한 것은 Runnable 인터페이스를 구현하여 생성된 스레드가 동일한 리소스를 처리할 수 있어 리소스 공유가 가능하다는 점입니다.

(1) Thread 클래스를 확장하여 다중 생성합니다. 스레드

극장에 어린이, 성인, 노인에게 티켓을 판매하는 데 사용되는 세 개의 티켓 판매점이 있다고 가정해 보겠습니다. 극장에는 각 창구마다 어린이 티켓, 성인 티켓, 노인 티켓 등 100장의 영화 티켓이 있습니다. 세 개의 창구가 동시에 티켓을 판매해야 하는데, 이제 티켓 판매자는 한 명뿐입니다. 이 티켓 판매자는 CPU에 해당하고 창구 3개는 스레드 3개에 해당합니다. 이 세 가지 스레드가 프로그램을 통해 어떻게 생성되는지 살펴보겠습니다.

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());
  }
 }
}

스레드 클래스는 Thread 클래스를 확장하는 프로그램에 정의되어 있습니다. 확장 스레드 클래스를 사용하여 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());
  }
 }
}

결과적으로 앞서 분석한 바와 같이 프로그램은 메모리에 하나의 리소스만 생성하고 새로 생성된 3개의 스레드는 모두 해당 리소스에 대한 액세스를 기반으로 합니다. 그리고 동일한 코드가 각 스레드에서 실행되기 때문에 동일한 기능을 수행합니다.

실제 문제에서 동일한 작업을 수행하기 위해 여러 스레드를 생성해야 하고 여러 스레드가 동일한 리소스를 공유하는 경우 Runnable 인터페이스를 구현하여 다중 스레드 프로그램을 만들 수 있음을 알 수 있습니다. . 이 기능은 Thread 클래스를 확장함으로써 달성될 수 없습니다. 독자들은 왜 그렇게 생각할까요?

Runnable 인터페이스를 구현하면 Thread 클래스를 확장하는 것보다 비교할 수 없는 이점이 있습니다. 이 방법은 코드를 여러 스레드에서 공유할 수 있어 프로그램의 견고성에 도움이 될 뿐만 아니라 코드와 데이터 리소스가 상대적으로 독립적이므로 동일한 코드를 사용하는 여러 스레드가 동일한 작업을 처리하는 상황에 특히 적합합니다. 의지. 이러한 방식으로 스레드, 코드 및 데이터 리소스가 효과적으로 분리되며 이는 객체 지향 프로그래밍 아이디어를 잘 반영합니다. 따라서 거의 모든 멀티스레드 프로그램은 Runnable 인터페이스를 구현함으로써 완성됩니다.

위 내용은 Java에서 스레드를 생성하기 위한 두 가지 방법의 예제 코드 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.