Java 스레드 비교 스레드, 런 가능, 호출 가능
Java는 스레드 클래스를 사용하여 스레드를 나타냅니다. 모든 필드 객체는 스레드 클래스 또는 하위 클래스의 인스턴스 여야합니다. 각 스레드의 기능은 실제로 프로그램 흐름을 실행하는 특정 작업을 완료하는 것입니다. Java는 스레드 실행 본체를 사용 하여이 프로그램 흐름을 나타냅니다.
1. 스레드 클래스를 상속하여 스레드를 생성합니다
멀티 스레딩을 시작하는 단계는 다음과 같습니다.
(1) 스레드 클래스의 서브 클래스를 정의하고 클래스의 run () 메소드를 무시합니다. run () 메소드의 메소드 본문은 클래스 스레드가 완료 해야하는 작업을 나타냅니다. 따라서 run () 메소드를 스레드 실행 본체라고합니다.
(2) 스레드 서브 클래스의 인스턴스를 만듭니다. 즉, 스레드 객체를 만듭니다.
(3) 스레드의 스타 () 메소드를 호출하여 스레드를 시작하십시오.
관련 코드는 다음과 같습니다.
/ *** 예를 들어 티켓을 구매하기 위해 내부 클래스의 스레드를 상속받습니다*/ public class firstthread는 스레드 {private int i; 개인 int 티켓 = 10; @override public void run () {for (; i <20; i ++) {// 스레드를 상속 할 때 이것을 직접 사용하여 현재 스레드를 가져 오면 getName () 현재 스레드의 이름을 가져옵니다 // log.d (tag, getName ()+""+i); if (this.ticket> 0) {log.e (tag, getName () + ", 티켓 판매 : 티켓 =" + 티켓-); }}}} private void starticketthread () {log.d (tag, "starticketthread", thread.currentThread (). getName ()); FirstThread Thread1 = New FirstThread (); FirstThread Thread2 = New FirstThread (); FirstThread Thread3 = New FirstThread (); thread1.start (); Thread2.start (); Thread3.start (); // 티켓을 구입할 3 개의 스레드를 열고 각 스레드는 10 개의 티켓을 판매하고 총 30 개의 티켓을 판매했습니다}실행 결과 :
3 개의 스레드가 입력 한 투표 변수가 연속적이지 않음을 알 수 있습니다. 참고 : 티켓은 로컬 변수가 아닌 FirstThread의 인스턴스 속성이지만 프로그램은 스레드 객체를 생성 할 때마다 첫 번째 기사 객체를 만들어야하기 때문에 모든 여러 스레드가 인스턴스의 속성을 공유하지 않습니다.
2. 실행 가능한 인터페이스를 구현하여 스레드를 생성합니다
참고 : 공개 클래스 스레드는 실행 가능합니다
(1) Runnable 인터페이스의 구현 클래스를 정의하고 인터페이스의 run () 메소드를 재정의합니다. run () 메소드의 메소드 본문은 또한 스레드의 스레드 실행 본체입니다.
(2) 실행 가능한 인스턴스 클래스의 인스턴스를 만듭니다. 이 인스턴스는 스레드 객체를 만들기 위해 스레드 대상으로 사용됩니다. 스레드 객체는 실제 객체입니다.
관련 코드는 다음과 같습니다.
/ ** * 실행 가능한 인터페이스를 구현하고 스레드 클래스를 만듭니다 */ public class Secondthread는 런닝 가능한 {private int i; 개인 int 티켓 = 100; @override public void run () {for (; i <20; i ++) {// 스레드 클래스가 실행 가능한 인터페이스를 구현하는 경우 // 현재 스레드를 가져 오면 스레드 만 사용할 수 있습니다. if (this.ticket> 0) {log.e (tag, thread.currentthread (). getName () + ", 티켓 판매 : ticket =" + ticket--); }}}} private void starticketthread2 () {log.d (tag, "starticketthread2,"+thread.currentThread (). getName ()); Secondthread SecondThread = 새로운 SecondThread (); // 새 스레드 (target, name) 새 스레드를 통해 새 스레드를 만듭니다 (Secondthread, "Ticket Buyer 1"). start (); 새 스레드 (두 번째 스레드, "티켓 구매자 2"). start (); 새 스레드 (두 번째 스레드, "티켓 구매자 3"). start (); // 3 개의 스레드가 열려 있었지만 총 100 개의 티켓 만 구입했습니다}실행 결과 :
3 개의 스레드가 입력 한 투표 변수는 연속적이며 여러 스레드가 실행 가능한 인터페이스를 사용하여 스레드 클래스 인스턴스의 속성을 공유 할 수 있음을 알 수 있습니다. 이런 식으로 프로그램에 의해 생성 된 실행 가능한 객체는 스레드의 대상 일 뿐이며 여러 스레드가 동일한 대상을 공유 할 수 있으므로 여러 스레드가 동일한 스레드 클래스의 인스턴스 속성을 공유 할 수 있기 때문입니다 (실제로 스레드의 대상 클래스이어야 함).
3. 호출 가능하고 미래를 사용하여 스레드를 만듭니다
Java 5에서 시작하여 Java는 호출 가능한 인터페이스를 제공하며, 이는 Runnable의 향상된 버전입니다. Callable은 스레드 실행 본체로 사용할 수있는 클래스 () 메소드를 제공하지만 Call () 메소드는 더 강력합니다.
(1) call () 메소드는 반환 값을 가질 수 있습니다 (2) Call () 메소드는 예외를 제외 할 수 있습니다.
따라서 스레드 대상으로 호출 가능한 객체를 제공 할 수 있으며 스레드의 집행자는 호출 가능한 객체의 Call () 메소드입니다. 동시에 Java 5는 Callable 인터페이스에서 Call () 메소드의 리턴 값을 나타내는 향후 인터페이스를 제공하고 FutureTask 구현 클래스를 제공합니다. 이 구현 클래스는 미래의 인터페이스를 구현하고 실행 가능한 인터페이스 (스레드 클래스로 사용할 수있는 대상을 구현합니다.
시작 단계는 다음과 같습니다.
(1) Callable 인터페이스의 구현 클래스를 작성하고 Call () 메소드를 구현하십시오. Call () 메소드는 스레드의 실행 본체로 사용되며 Call () 메소드에는 리턴 값이 있습니다.
(2) Callable 구현 클래스의 인스턴스를 작성하고 FutureTask 클래스를 사용하여 호출 가능한 객체를 감싸십시오. FutureTask 객체는 Call () 메소드의 리턴 값을 캡슐화합니다.
(3) FutureTask 객체를 스레드 객체의 대상으로 사용하여 새 스레드를 작성하고 시작하십시오.
(4) FutureTask 객체의 get () 메소드를 호출하여 자식 스레드가 실행 된 후 리턴 값을 얻습니다.
관련 코드는 다음과 같습니다.
/ *** Callable을 사용하여 스레드 클래스를 구현하려면*/ public class ThirdThread 구현 호출 가능 <integer> {private int ticket = 20; @override public integer call () {for (int i = 0; i <10; i ++) {// 현재 스레드를 가져 오면 stread.currentthread () 만 사용할 수 있습니다. if (this.ticket> 0) {log.e (tag, thread.currentthread (). getName () + ", 티켓 : ticket =" + ticket--); }} 반품 티켓; }} private void starcallableThread () {ThirdThread ThirdThread = new ThirdThread (); FutureTask <integer> task = 새로운 futuretask <integer> (Thirdthread); 새 스레드 (작업, "return 값이있는 스레드"). start (); try {integer integer = task.get (); log.d (tag, "StarcallableThread, Child Thread의 반환 값 ="+정수); } catch (InterruptedException e) {e.printstacktrace (); } catch (executionException e) {e.printstacktrace (); }}실행 결과 :
참고 : Callable의 Call () 메소드를 사용하면 선언이 예외를 던지고 반환 값을 허용합니다.
이 프로그램은 마침내 FutureTask 객체의 get () 메소드를 호출하여 Call () 메소드의 리턴 값을 반환하여 Call () 메소드가 끝나고 반환 될 때까지 기본 스레드를 차단하게합니다.
4. 세 가지 방법의 비교
스레드 클래스를 상속하여 멀티 스레딩을 만듭니다
단점 : 스레드 클래스가 상속 된 다른 상위 클래스에서 상속받을 수 없습니다.
장점 : 쓰기가 간단합니다
실행 가능하고 호출 가능한 인터페이스를 상속하는 방법을 사용하여 멀티 스레딩 생성
단점 : 프로그래밍은 약간 복잡합니다. 현재 스레드에 액세스 해야하는 경우 Thread.CurrentThread ()를 사용해야합니다.
장점 :
(1) 다른 클래스를 상속 할 수 있습니다 (2) 다중 스레드는 대상 객체를 공유 할 수 있으므로 여러 동일한 스레드가 동일한 리소스를 처리하는 데 매우 적합하여 CPU, 코드 및 데이터를 분리하여 명확한 모델을 형성하여 클래스의 객체 지향적 아이디어를 더 잘 반영합니다.
읽어 주셔서 감사합니다. 도움이되기를 바랍니다. 이 사이트를 지원 해주셔서 감사합니다!