1. 스레드의 기본 개념
스레드 이해 : 스레드는 프로그램에서 다른 실행 경로입니다.
각 지점을 스레드라고하며 main ()은 메인 브랜치라고하며 메인 스레드라고도합니다.
프로세스는 정적 개념, 컴퓨터의 .class 파일, 컴퓨터의 .exe 파일 일뿐입니다.이를 프로세스라고합니다. 프로그램의 실행 프로세스는 다음과 같습니다. 첫째, 프로그램의 코드를 메모리의 코드 영역에 넣으십시오. 코드가 코드 영역에 배치 된 후 즉시 실행되지 않습니다. 그러나 이것은 프로세스가 시작될 준비가되었음을 의미합니다. 프로세스가 생성되었지만 아직 실행되기 시작하지 않았습니다. 이것은 프로세스이므로 프로세스는 실제로 정적 개념이며 그 자체로 움직일 수 없습니다. 일반적인 프로세스 실행은 실행되기 시작하는 프로세스의 기본 스레드, 즉 메인 () 메소드가 실행되기 시작합니다. 프로세스는 정적 개념이며 실제로 스레드는 기계에서 실행됩니다.
Windows 운영 체제는 멀티 스레딩을 지원합니다. 많은 스레드를 동시에 실행할 수 있으며 여러 프로세스도 지원합니다. 따라서 Windows 운영 체제는 멀티 스레딩 및 다중 처리를 지원하는 운영 체제입니다. Linux와 Uinux는 또한 멀티 스레딩 및 다중 처리를 지원하는 운영 체제입니다. DOS는 멀티 스레딩 및 다중 처리를 지원하지 않습니다. 단일 프로세스 만 지원합니다. 단일 스레딩이라고하는 동일한 시점에서 하나의 프로세스 만 실행됩니다.
CPU가 정말 강력하고 동시에 많은 프로그램을 실행할 수 있습니까? 아니요, CPU의 실행은 다음과 같습니다. CPU는 매우 빠르며 1 초 만에 수억 번 계산할 수 있으므로 CPU는 시간을 작은 시간 조각으로 나눌 수 있습니다. 나는이 시간 슬라이스를 잠시 동안 실행한다. 다음에 슬라이스가 잠시 동안 실행되고 다음 번에 슬라이스가 잠시 동안 실행됩니다. 수십 개의 스레드가 있지만 아주 짧은 시간 안에 모든 실을 실행할 수 있습니다. 그러나 우리 인간에게는 CPU의 실행 속도가 너무 빠르기 때문에 동시에 실행되는 것처럼 보이지만 실제로는 CPU에서 실행되는 스레드가 하나뿐입니다.
우선, 스레드를 학습 할 때 세 가지 개념을 이해해야합니다 .
1. 프로세스 : 프로세스는 정적 개념입니다
2. 스레드 : Main () 메소드라는 프로세스에는 프로그램이자 프로세스의 다른 실행 경로가 있습니다.
3. 동시에 CPU는 하나의 스레드 만 실행할 수있는 스레드 만 지원할 수 있습니다. CPU가 매우 빠르게 실행되기 때문에 우리는 멀티 스레딩 인 것처럼 보입니다.
진정한 멀티 스레딩 란 무엇입니까? 기계에 듀얼 CPU 또는 듀얼 코어가있는 경우 실제로는 다중 스레드입니다.
2. 스레드의 생성 및 시작
Java에서 Java 스레드는 java.lang.thread 클래스를 통해 구현되며 각 스레드 객체는 새 스레드를 나타냅니다. 새 스레드를 만드는 방법에는 두 가지가 있습니다. 첫 번째는 스레드 클래스에서 상속하는 것이고 다른 첫 번째는 실행 가능한 인터페이스를 구현하는 것입니다. VM이 시작되면 기본 메소드 (public static void main ())에 의해 정의 된 스레드가 있으며이 스레드를 기본 스레드라고합니다. 스레드 인스턴스를 만들어 새 스레드를 만들 수 있습니다. 새 스레드 객체 만 있으면 새로운 스레드가 나타납니다. 각 스레드는 특정 스레드 객체에 해당하는 메소드 run ()을 통해 작동을 완료합니다. 메소드 런 ()을 스레드 본체라고합니다.
예 1 : 런닝 가능한 인터페이스의 구현을 사용하여 새 스레드를 만들고 시작합니다.
실행 메소드를 호출 할 새 스레드를 만듭니다
PACKED CN.GALC.TEST; public class testthread1 {public static void main (String args []) {runner1 r1 = new Runner1 (); // 여기 스레드 클래스의 새로운 개체가 나옵니다. // r1.run (); // 메소드 호출이라고합니다. 메소드 호출의 실행은 main () 메소드가 계속 실행되기 전에 run () 메소드가 실행될 때까지 기다리는 것입니다. 스레드 t = 새 스레드 (r1); // 새 스레드를 시작하려면 새 스레드 객체가 나오려면 // 스레드 (runnable target)가 여기에서 사용됩니다. 생성자 t.start (); // 새로 열린 스레드를 시작하고 새 스레드는 run () 메소드를 실행하고 새 스레드와 기본 스레드는 (int i = 0; i <10; i ++) {System.out.println ( "mingeod :"+i); }}}/*런닝 가능한 인터페이스를 구현하기 위해 클래스를 정의합니다. 런닝 가능한 인터페이스를 구현한다는 것은이 클래스가 스레드 클래스*/클래스 러너라는 것을 의미합니다. runnable {public void run () {for (int i = 0; i <10; i ++) {system.out.println ( "runner1 :"+i); }}}다중 스레드 프로그램의 실행 프로세스는 다음과 같습니다.
새 스레드를 열지 않고 직접 실행 메소드를 호출하십시오.
작업 결과는 다음과 같습니다.
예 2 : 스레드 클래스를 상속하고 run () 메소드를 재정의하여 새 스레드를 작성하고 시작합니다.
패키지 cn.galc.test;/*스레드 생성 및 시작의 두 번째 방법 : 스레드의 서브 클래스를 정의하고 run () 메소드*/public class testthread2 {public static void main (String args []) {runner2 = new Runner2 (); r2.start (); // start () 메소드를 호출하여 새로 열린 스레드 (int i = 0; i <= 10; i ++) {System.out.println ( "mainmethod :"+i); }}}/*runner2 클래스는 runner2 클래스의 객체를 인스턴스화하여 스레드 클래스에서 상속합니다. 새 스레드를 열 수 있습니다. 스레드 클래스에서 상속 된 start () 메소드를 호출하십시오. 새로 열린 스레드를 시작할 수 있습니다*/class Runner2는 스레드 {public void run () {// run () 메소드의 구현을 다시 작성할 수 있습니다 (int i = 0; i <= 10; i ++) {system.out.println ( "runner2 :"+i); }}}새로운 스레드를 생성하기 위해 두 가지 방법을 사용하여 선택한 인터페이스를 구현하고 스레드 클래스를 상속하는 선택은 새 스레드를 여는 데 우선 순위를 두어야합니다. 인터페이스의 구현은 다중 구현이 가능하기 때문에 클래스 상속은 단일 상속 일 수 있습니다. 따라서 새 스레드를 열 때 달리기 가능한 인터페이스를 사용할 수 있으면 스레드 클래스에서 상속을 사용하여 새 스레드를 열지 마십시오.
3. 스레드 상태 전환
3.1. 스레드 제어의 기본 방법
3.2. 수면/조인/수율 방법 소개
수면 방법의 적용 예 :
패키지 cn.galc.test; import java.util.*; public class testthread3 {public static void main (String args []) {mythread 스레드 = new Mythread (); shread.start (); // 새로 열린 스레드를 시작하려면 start () 메소드를 호출합니다. {/* thread.sleep(10000); sleep () 메소드는 스레드 클래스에서 선언 된 정적 메소드이므로 thread.sleep ()의 형식을 사용하여 * / /* mythread.sleep(10000); Mythread Class는 스레드 클래스를 상속하고 자연스럽게 Sleep () 메소드를 상속하므로 Mythread.sleep () *// *의 형식을 사용하여 호출 할 수 있습니다. 정적 메소드의 호출은 "class name.static 메소드 이름"또는 "object reference.Static 메소드 이름" */ mythread.sleep (10000)의 형태로 직접 호출 될 수 있습니다. System.out.println ( "메인 스레드는 10 초 동안 자고 다시 시작합니다"); // main () 메소드에서 다른 클래스의 정적 메소드를 호출 할 때 "class.static 메소드 이름이 위치한 위치 이름"을 사용해야합니다. 어떤 스레드가 Sleep () 메소드를 호출하므로 이제 메인 스레드가 자고 있습니다. */} catch (InterruptedException e) {e.printstacktrace (); } //thread.interrupt() ;//use interprupt () 메소드 스레드 스레드 실행을 종료하기위한 스레드. 플래그 = false; // 루프 조건을 변경하고 Dead Loop/** *를 종료하고, 인터럽트 exception이 발생하면, 루프 조건을 Dead Loop에 직접 설정 한 다음 하위 스레드의 실행을 종료합니다. 이것은 자식 스레드를 종료하는 더 좋은 방법입니다* / / *** running 스레드를 깨기 위해 인터럽트 () 메소드를 호출하는 방법은 메인 스레드에 냉수 냄비를 붓고 실행 하위 스레드를 깨뜨리는 것과 같습니다. 하위 스레드 실행이 중단되면 인터럽트 꺼짐이 발생하여 리턴 명령문을 실행하고 스레드의 실행을 종료합니다. 따라서 서브 스레드는 10 초의 실행 후 스레드의 실행을 종료합니다 */}} 클래스 신화는 스레드를 확장합니다 {boolean flag = true; // 루프 공공 void run ()의 조건을 제어하기위한 태그를 정의합니다. 다시 쓰여진 방법과 다른 예외를 던지십시오. * 따라서 여기에서만 시도 할 수 있습니다 ... catch () 예외를 잡으려면*/ while (flag) { System.out.println ( "==================================================================================================================== ====================================================================== ====================================================================== ====================================================================== ====================================================================== ====================================================================== ======================================================================== 물론 "클래스 이름. 메소드 이름"*// mythread.sleep (1000)의 형식을 사용하는 것은 잘못이 아닙니다. // "클래스 이름. 메소드 이름"형식을 사용하여 정적 메소드 수면을 호출합니다 (1000) 데드 루프에서 매 초마다, 현재 시스템 시간이 인쇄됩니다.} 캐치 (InterpruptedExcept e) { /** 수면이있을 때는 수면을 방해 할 수 있습니다. 따라서 러닝 스레드가 예기치 않은 이유에 의해 중단 될 때, 방해받는 예외는* / reture retless retless에 중단 될 수 있습니다. }}실행 결과 :
조인 메소드의 예 :
package cn.galc.test; public class testthread4 {public static void main (String Args []) {Mythread2 Thread2 = new Mythread2 ( "Mythread"); // 새 스레드 객체를 작성하는 동안 스레드 객체 이름 Mythread Resture (); // START 스레드 try {strood2.join (); join () 메서드를 호출하여 스레드를 병합하고, 하위 스레드를 메인 스레드로 병합하여 스레드를 병합 한 후, 프로그램의 실행 프로세스와 동일합니다. } for (int i = 0; i <= 5; i ++) {System.out.println ( "I Main Thread"); }}} class mythread2 스레드 {mythread2 (strings) {super (s); / * * 슈퍼 키워드를 사용하여 부모 클래스의 생성자를 호출하여 상위 클래스 스레드의 생성자 중 하나 : "공개 스레드 (문자열 이름)" * 그러한 생성자를 통해 새로 오픈 한 스레드는 이름을 지정할 수 있으며,이 스레드의 관리를 용이하게하는 {int i = 1; i <= 5; i ++) {systal.out.out.out.out. getName ()); // public final string getName ()를 부모 클래스 스레드에 정의하면이 스레드의 이름을 반환합니다. 시도 {sleep (1000); // 실행 될 때마다 하위 스레드를 1 초 동안 수면} catch (InterpruptedException e) {return; }}}}실행 결과 :
수율 방법의 사용 예 :
package cn.galc.test; public class testthread5 {public static void main (String args []) {mythread3 t1 = new Mythread3 ( "T1"); /* 두 개의 아동 스레드 T1과 T2가 동시에 열렸습니다. T1과 T2는 모두 run () 메소드*//*이 프로그램을 실행하는 동안 병렬로 총 3 개의 스레드가 있습니다. t1.start (); // 스타터 자식 스레드 t1 t2.start (); // 스타터 자식 스레드 t2 for (int i = 0; i <= 5; i ++) {system.out.println ( "i am main stresh"); }}} class mythread3은 스레드 {mythread3 (문자열 s) {super (s); } public void run () {for (int i = 1; i <= 5; i ++) {system.out.println (getName () + ":" + i); if (i%2 == 0) {axplity (); // 실행이 도달하면 2로 나눌 수 있고, 현재 실행 실행이 나와서 실행되는 다른 스레드가 먼저 실행되도록합니다./ * * 프로그램 실행 중에 볼 수 있습니다. 시간, 그것은 우선 순위 실행 */}}에 대한 스레드를 t1 스레드로 제공합니다.작업 결과는 다음과 같습니다.
위는이 기사의 모든 내용입니다. 우리는 그것이 당신을 도울 수 있기를 바랍니다.