1. 스레드의 개념 : 스레드는 작업의 실행 흐름을 처음부터 끝까지 나타냅니다. 스레드는 작업을 실행하는 메커니즘을 제공합니다. Java의 경우 프로그램에서 여러 스레드를 동시에 실행할 수 있으며 이러한 스레드는 다중 프로세서 시스템에서 동시에 실행될 수 있습니다. 프로그램이 응용 프로그램으로 실행되면 Java 통역사는 Main () 메소드의 스레드를 시작합니다.
2. 평행 및 동시성 :
(1) 동시성 : 단일 프로세서 시스템에서 여러 스레드가 CPU 시간을 공유하며 운영 체제는 자원을 예약하고 할당하는 일을 담당합니다.
(2) 병렬 처리 : 다중 프로세서 시스템에서 여러 프로세서가 동시에 여러 스레드를 실행할 수 있습니다. 이 스레드는 동시에 동시에 실행될 수 있습니다. 동시성과 달리 여러 스레드 만 CPU 시간을 공유 할 수 있으며 동시에 하나의 스레드 만 실행할 수 있습니다.
3. 스레드 생성 :
(1) 기본 개념 : Java의 각 작업은 런닝 가능한 대상입니다. 작업을 만들려면 작업 클래스를 먼저 정의해야하며 작업 클래스는 실행 가능한 인터페이스를 구현해야합니다. 스레드는 본질적으로 작업 실행에 편리한 객체입니다. 스레드의 실행 프로세스는 끝까지 작업 클래스에서 run () 메소드의 실행입니다.
(2) 런닝 가능한 인터페이스를 통해 스레드 생성 :
에이. 작업 클래스를 정의하여 runnable 인터페이스를 구현하고 runnable 인터페이스에서 run () 메소드를 구현하고 (run () 메소드에서 시스템 스레드에 실행 방법을 알려주고 Run () 메서드에서 특정 작업 코드 또는 처리 로직을 정의하십시오.
비. 작업 클래스를 정의한 후 작업 클래스의 작업 객체를 만듭니다.
기음. 작업은 스레드에서 실행되고 트레드 클래스의 객체를 생성하고 트레드 클래스의 생성자에 대한 런 가능한 인터페이스를 매개 변수로 구현하는 작업 클래스 객체를 전달해야합니다.
디. 트레드 클래스 객체의 시작 () 메소드를 호출하고 스레드를 시작하십시오. 작업의 run () 메소드가 실행됩니다. run () 메소드가 실행되면 스레드가 종료됩니다.
예제 코드 :
package com.muzeet.mutithread; // 각 작업은 실행 가능한 인터페이스의 인스턴스입니다. 작업은 실행 가능한 객체이며 스레드는 작업의 실행을 용이하게하는 객체입니다. 작업 클래스를 생성하고 실행 메소드를 재정의하여 작업 공개 클래스 ThreadDemo1 implements runnable {private int countdown = 10; @override // 실행 메소드를 다시 작성하고 작업을 정의하고 공개 void run () {while (countdown-> 0) {System.out.println ( "$" + thread.currentThread (). getName () + "(" + countdown + ")"; }} // 시작 메소드를 호출하면 스레드가 시작되어 작업의 실행 메소드가 호출됩니다. 실행 메소드가 실행 된 후, 스레드는 공개 정적 void main (String [] args) {runnable demo1 = new ThreadDemo1 ()을 종료합니다. 스레드 스레드 1 = 새 스레드 (DEMO1); 스레드 스레드 2 = 새 스레드 (DEMO1); thread1.start (); Thread2.start (); System.out.println ( "로켓 런칭 카운트 다운 :"); }}프로그램 실행 결과 :
로켓 런칭 카운트 다운 : $ stread-0 (9) $ 스레드 -0 (8) $ Thread-0 (7) $ Thread-0 (6) $ Thread-0 (5) $ Thread-0 (4) $ stread-0 (3) $ stread-0 (2) $ stread-0 (1) $ stread-0 (0)
동시에 두 작업 객체를 실행하십시오.
public static void main (String [] args) {runnable demo1 = new ThreadDemo1 (); runnable demo2 = new ThreadDemo1 (); 스레드 스레드 1 = 새 스레드 (DEMO1); 스레드 스레드 2 = 새 스레드 (DEMO2); thread1.start (); Thread2.start (); System.out.println ( "로켓 런칭 카운트 다운 :"); }실행 결과 :
로켓 런칭 카운트 다운 : $ stread-0 (9) $ stread-0 (8) $ stread-0 (7) $ stread-0 (6) $ Thread-1 (9) $ Thread-0 (5) $ Thread-1 (8) $ stread-0 (4) $ Thread-1 (7) $ Thread-0 (3) $ stread-1 (6) $ stread-1 (5) $ stread-0 (2) $ stread-1 (4) $ stread-1 (3) $ stread-1 (2) $ stread-1 (1) $ stread-1 (0) $ stread-0 (1) $ Thread-0 (0)
(3) 스레드 클래스를 상속하여 스레드를 생성합니다.
에이. 먼저 작업 클래스 생성 스레드 클래스를 확장합니다. 스레드 클래스는 실행 가능한 인터페이스를 구현하기 때문에 사용자 정의 된 작업 클래스는 특정 작업 코드 또는 처리 로직을 정의하는 실행 가능한 인터페이스 및 rerun () 메소드를 구현합니다.
비. 스레드를 사용하거나 사용자 정의 변수 유형으로 실행할 수있는 작업 클래스 객체를 만듭니다.
기음. 사용자 정의 객체의 시작 () 메소드를 호출하고 스레드를 시작하십시오.
샘플 코드 :
package com.muzeet.mutithread; // 각 작업은 실행 가능한 인터페이스의 인스턴스입니다. 작업은 실행 가능한 객체이며 스레드는 객체를 실행할 수 있습니다. 작업 클래스가 생성되어야하며 실행 메소드를 재정의하려면 공개 클래스를 정의하려면 strule {private int countdown = 10; @override // 실행 메소드를 다시 작성하고 작업을 정의하고 공개 void run () {while (countdown-> 0) {System.out.println ( "$" + this.getName () + "(" + countdown + ")"); }} // 시작 메소드를 호출하면 스레드가 시작되어 작업의 실행 메소드가 호출됩니다. 실행 메소드가 실행 된 후, 스레드는 공개 정적 void main (string [] args) {extendfromthread thread1 = new ExtendFromthread ()를 종료합니다. extendfromthlestread 2 = new ExtendFromthread (); thread1.start (); Thread2.start (); System.out.println ( "로켓 런칭 카운트 다운 :"); }}실행 결과 :
로켓 런칭 카운트 다운 : $ Thread-0 (9) $ stread-0 (8) $ stread-0 (7) $ stread-0 (6) $ Thread-0 (5) $ Thread-0 (4) $ Thread-0 (3) $ stread-0 (2) $ Thread-0 (1) $ Thread-0 (0) $ stread-1 (9) $ stread-1 (8) $ stread-1 (7) $ stread-1 (6) $ stread-1 (5) $ stread-1 (4) $ stread-1 (3) $ stread-1 (2) $ stread-1 (1) $ stread-1 (0)
하나의 스레드는 실행하기 전에 다른 스레드가 종료 될 때까지 기다립니다. printnum 작업을 실행할 때, 숫자 50을 인쇄 할 때 인쇄 캐릭터 C를 실행하는 다음 스레드 스레드 4가 실행 된 후에 만 인쇄 번호 작업을 계속 실행합니다.
package com.muzeet.testthread; public class printnum emplements runnable {private int lastnum; public printnum (int n) {lastnum = n; } @override public void run () {// todo 자동 생성 메소드 스터브 스레드 스레드 4 = 새 스레드 (새 프린트 char ( 'C', 40)); Thread4.start (); {for (int i = 1; i <= lastnum; i ++) {system.out.println ( ""+i); if (i == 50) {Thread4.join (); }}} catch (InterruptedException e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); }}}4. 두 가지 방법의 비교 (재 인쇄)
먼저 두 가지 방법의 출력 결과를 분석합니다. 우리는 또한 두 개의 스레드를 만듭니다. 결과가 다른 이유는 무엇입니까?
실행 가능한 인터페이스를 사용하여 스레드를 생성하면 동일한 대상 객체 (treaddemo1tt = newTreadDemo1 ();)을 공유하여 동일한 리소스를 처리하기 위해 여러 동일한 스레드를 구현할 수 있습니다. 첫 번째 스레드가 작업을 완료하면 카운트 다운은 이미 0이므로 두 번째 스레드는 출력되지 않습니다. 스레드별로 스레드를 생성하는 방법을 상속하면, 각 멤버 변수와 함께 두 개의 작업 클래스 객체가 생성되며 서로를 방해하지 않습니다.
그런 다음 JDK의 설명을보십시오.
실행 가능한 인터페이스는 특정 스레드를 통해 인스턴스를 실행하려는 클래스별로 구현해야합니다. 클래스는 run이라는 매개 변수가없는 메소드를 정의해야합니다.
이 인터페이스를 설계하는 목적은 활성화 될 때 코드를 실행하려는 객체에 대한 공개 프로토콜을 제공하는 것입니다. 예를 들어, 스레드 클래스는 실행 가능합니다. 활성화는 스레드가 시작되었고 아직 중지되지 않았 음을 의미합니다.
또한 Runnable은 스레드의 서브 클래스가 아닌 클래스에 대한 활성화 방법을 제공합니다. 스레드 인스턴스를 인스턴스화하고 실행중인 대상으로 스스로를 사용하면 런닝 가능한 클래스를 실행할 수 있습니다. 대부분의 경우 run () 메소드를 무시하고 다른 스레드 메소드를 무시하지 않으려면 Runnable 인터페이스를 사용해야합니다. 프로그래머가 클래스의 기본 동작을 수정하거나 향상시키지 않으면 해당 클래스에 대한 서브 클래스를 만들어서는 안되기 때문에 이것은 중요합니다. (작업 클래스를 작성하고 스레드 클래스를 상속하는 대신 실행 가능한 인터페이스를 구현하는 것이 좋습니다)
스레드 클래스의 상속을 채택하십시오.
(1) 장점 : 쓰기 쉬운. 현재 스레드에 액세스 해야하는 경우 thread.currentthread () 메소드를 사용할 필요가 없습니다. 이것을 사용하여 현재 스레드를 직접 얻을 수 있습니다.
(2) 단점 : 스레드 클래스가 스레드 클래스를 물려 받았기 때문에 다른 상위 클래스를 물려받을 수 없습니다.
실행 가능한 인터페이스 방법 사용 :
(1) 장점 : 스레드 클래스는 실행 가능한 인터페이스 만 구현하고 다른 클래스를 물려받을 수도 있습니다. 이러한 방식으로, 여러 스레드가 동일한 대상 객체를 공유 할 수 있으므로 여러 동일한 스레드가 동일한 자원을 처리하는 데 매우 적합하므로 CPU 코드와 데이터를 분리하여 명확한 모델을 형성 할 수 있으며, 이는 객체 지향 아이디어를 더 잘 반영합니다.
(2) 단점 : 프로그래밍은 약간 복잡합니다. 현재 스레드에 액세스 해야하는 경우 Thread.CurrentThread () 메소드를 사용해야합니다.
요약
위의 것은 Java Multithreading 및 비교 코드 예제에서 스레드를 만드는 두 가지 방법에 관한 것입니다. 모든 사람에게 도움이되기를 바랍니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!