이 기사에서 제공하는 내용은 Java에서 스레드를 생성하는 방법이 무엇인지입니다. Java에서 스레드를 생성하는 세 가지 방법에는 특정 참고 가치가 있습니다. 도움이 필요한 친구가 참고할 수 있기를 바랍니다.
1. Thread 클래스 생성 상속
Thread를 상속하고 run()을 다시 작성하면 스레드가 run 메서드에서 작업을 실행합니다. 생성된 서브클래스는 start() 메서드를 호출하여 스레드 메서드를 실행할 수 있습니다.
Thread가 구현한 스레드 클래스를 상속함으로써 스레드 클래스의 인스턴스 변수를 여러 스레드 간에 공유할 수 없습니다. (다른 Thread 객체를 생성해야 하며 당연히 공유되지 않음)
예:
/** * 通过继承Thread实现线程 */ public class ThreadTest extends Thread{ private int i = 0 ; @Override public void run() { for(;i<50;i++){ System.out.println(Thread.currentThread().getName() + " is running " + i ); } } public static void main(String[] args) { for(int j=0;j<50;j++){if(j=20){ new ThreadTest().start() ; new ThreadTest().start() ; } } } }
2. Runnable 인터페이스를 통해 스레드 클래스를 생성합니다.
이 방법을 사용하려면 먼저 Runnable 인터페이스를 구현하기 위한 클래스를 정의하고 인터페이스 재작성 run() 메소드, 이 실행 메소드는 스레드 실행 본문입니다. 그런 다음 Thread 객체를 생성하기 위한 매개변수 대상으로 Runnable 구현 클래스의 객체를 생성합니다. 이 Thread 객체는 실제 스레드 객체입니다. Runnable 인터페이스를 구현하는 스레드 클래스는 서로 리소스를 공유합니다.
/** * 通过实现Runnable接口实现的线程类 */ public class RunnableTest implements Runnable { private int i ; @Override public void run() { for(;i<50;i++){ System.out.println(Thread.currentThread().getName() + " -- " + i); } } public static void main(String[] args) { for(int i=0;i<100;i++){ System.out.println(Thread.currentThread().getName() + " -- " + i); if(i==20){ RunnableTest runnableTest = new RunnableTest() ; new Thread(runnableTest,"线程1").start() ; new Thread(runnableTest,"线程2").start() ; } } } }
3. Callable과 Future를 사용하여 스레드 생성
Thread 클래스를 상속하고 Runnable 인터페이스를 구현한 것을 보면 알 수 있듯이 위 두 메서드 모두 반환 값을 가질 수 없고 선언할 수도 없습니다. 예외를 발생시킵니다. Callable 인터페이스는 이 두 가지 점을 실현합니다. Callable 인터페이스는 Runable 인터페이스의 업그레이드 버전과 같습니다. 이 인터페이스가 제공하는 call() 메서드는 스레드의 실행 본문 역할을 하며 반환 값을 허용합니다.
그러나 Callable 객체는 Thread 객체의 대상으로 직접 사용할 수 없습니다. 왜냐하면 Callable 인터페이스는 Java 5의 새로운 인터페이스이고 Runnable 인터페이스의 하위 인터페이스가 아니기 때문입니다. 이 문제에 대한 해결책은 call()의 반환 값을 받을 수 있는 Future 인터페이스를 도입하는 것입니다. Future 인터페이스는 Runnable 인터페이스의 하위 인터페이스이며 Thread 개체의 대상으로 사용할 수 있습니다. 게다가 Future 인터페이스는 FutureTask라는 구현 클래스를 제공합니다.
FutureTask는 Future 인터페이스와 Runnable 인터페이스를 구현하며 Thread 객체의 대상으로 사용할 수 있습니다.
관계는 다음과 같습니다.
예:
import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; public class CallableTest { public static void main(String[] args) { CallableTest callableTest = new CallableTest() ; //因为Callable接口是函数式接口,可以使用Lambda表达式 FutureTask<Integer> task = new FutureTask<Integer>((Callable<Integer>)()->{ int i = 0 ; for(;i<100;i++){ System.out.println(Thread.currentThread().getName() + "的循环变量i的值 :" + i); } return i; }); for(int i=0;i<100;i++){ System.out.println(Thread.currentThread().getName()+" 的循环变量i : + i"); if(i==20){ new Thread(task,"有返回值的线程").start(); } } try{ System.out.println("子线程返回值 : " + task.get()); }catch (Exception e){ e.printStackTrace(); } } }
Summary
위의 세 가지 방법을 통해 실제로는 클래스 상속과 인터페이스 구현이라는 두 가지 범주로 분류할 수 있습니다. 상속에 비해 인터페이스 구현은 더 유연할 수 있으며 Java의 단일 상속 메커니즘에 의해 제한되지 않습니다. 그리고 동일한 리소스를 멀티 스레드로 처리하는 데 적합한 인터페이스를 구현하여 리소스를 공유할 수 있습니다. 스레드 지식은 풍부하고 복잡하며 더 많은 세부 사항을 배우고 숙달해야 합니다.
위 내용은 Java에서 스레드를 생성하는 방법은 무엇입니까? Java에서 스레드를 생성하는 세 가지 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!