자바 스 레 드 생 성 및 시작

원본 링크:http://tutorials.jenkov.com/java-concurrency/creating-and-starting-threads.html 다른 자바 대상 과 마찬가지 로 자바 스 레 드 도 대상 입 니 다.스 레 드 는 자바 자바 자바. lang. Thread 류 또는 하위 클래스 의 인 스 턴 스 입 니 다.자바 스 레 드 는 일반적인 대상 외 에 도 코드 를 실행 할 수 있 습 니 다.
스 레 드 생 성 및 시작
자바 에서 스 레 드 를 만 들 수 있 습 니 다:
    Thread thread = new Thread();

start () 방법 으로 스 레 드 를 시작 할 수 있 습 니 다:
    thread.start();

이 예 에서 스 레 드 실행 코드 를 정의 하지 않 았 습 니 다.스 레 드 가 시작 되면 바로 멈 출 겁 니 다.
스 레 드 가 실 행 된 코드 를 정의 하 는 두 가지 방법 이 있 습 니 다.첫 번 째 는 Thread 하위 클래스 를 만 들 고 부모 클래스 를 다시 쓰 는 run () 방법 입 니 다.start () 방법 을 호출 하면 스 레 드 는 run () 방법 을 실행 합 니 다.다음은 하나의 예 이다.
    public class MyThread extends Thread {
        public void main() {
            System.out.println("MyThread running");
        }
    }

스 레 드 가 시 작 된 후에 start () 방법 호출 은 즉시 되 돌아 오고 run () 방법 이 실 행 될 때 까지 기다 리 지 않 습 니 다.run () 방법 은 다른 프로세서 에서 실행 되 는 것 과 같 습 니 다.run () 방법 이 실 행 될 때 텍스트 'My Thread running' 을 출력 합 니 다.
이렇게 익명 의 Thread 하위 클래스 를 만 들 수도 있 습 니 다:
    Thread thread = new Thread() {
        public void run() {
            System.out.println("Thread Running");
        }
    }
    thread.start();

이 예 에서 새 스 레 드 는 run () 방법 을 실행 하면 텍스트 'Thread running' 을 출력 합 니 다.
Runnable 인터페이스의 실현
어떤 코드 를 실행 할 지 스 레 드 를 지정 하 는 두 번 째 방식 은 자바. lang. Runnable 인 터 페 이 스 를 실현 하 는 클래스 를 만 드 는 것 입 니 다.Thread 대상 을 통 해 Runnable 대상 을 실행 할 수 있 습 니 다.
다음은 자바 Runnable 의 예 입 니 다.
    public class MyRunnable implements Runnable {
        public void run() {
            System.out.println("MyRunnable running");
        }

    } 

run () 방법 이 하나의 스 레 드 에 의 해 실 행 될 수 있 도록 MyRunnable 의 인 스 턴 스 를 Thread 류 의 구조 방법 에 전달 할 수 있 습 니 다.다음은 구체 적 인 방법 이다.
    Thread thread = new Thread(new MyRunnable());
    thread.start();

스 레 드 가 시작 되면 MyRunnable 인 스 턴 스 의 run () 방법 을 실행 하고 자신의 run () 방법 을 실행 하지 않 습 니 다.위의 예 에 서 는 'MyRunnable running' 텍스트 가 인쇄 됩 니 다.
이렇게 익명 의 Runnable 구현 클래스 를 만 들 수도 있 습 니 다.
    Runnable myRunnable = new Runnable() {
        System.out.println("Runnable runnig");
    }

    Thread thread = new Thread(myRunnable);
    thread.start();

Thread 에서 계승 하 시 겠 습 니까? 아니면 Runnable 인 터 페 이 스 를 실현 하 시 겠 습 니까?
두 가지 방법 중 어느 것 이 가장 좋 은 지, 정칙 이 없 으 면 두 가지 방법 이 모두 가능 하 다.그러나 저 는 개인 적 으로 Runnable 인 터 페 이 스 를 실현 한 다음 에 실현 류 의 인 스 턴 스 를 Thread 인 스 턴 스 에 전달 하 는 것 을 선 호 합 니 다.Runnable 의 실현 클래스 를 하나의 스 레 드 풀 을 통 해 실행 할 때 스 레 드 풀 에서 온 스 레 드 가 비어 있 으 면 Runnable 의 인 스 턴 스 가 줄 을 서기 쉽 습 니 다.Thread 의 하위 클래스 로 스 레 드 탱크 를 통 해 실행 하면 Runnable 의 실현 클래스 보다 어렵 습 니 다.
런 나 블 인터페이스 와 함께 Thread 클래스 를 계승 해 야 할 때 도 있 습 니 다.예 를 들 어 여러 개의 Runnable 을 실행 할 수 있 는 Thread 하위 클래스 를 만 듭 니 다. 이것 은 스 레 드 풀 을 실현 할 때 전형 적 인 장면 입 니 다.
일반적인 함정: start () 방법 대신 run () 방법 을 직접 호출 합 니 다.
스 레 드 스 레 드 를 만 들 고 시작 할 때 흔히 볼 수 있 는 오 류 는 start () 방법 이 아 닌 Thread 를 호출 하 는 run () 방법 입 니 다.
    Thread newThread = new Thread(MyRunnable));
    newThread.run(); //       newThread.start();

처음에는 별 다른 이상 이 없 었 을 것 이다.그러나 run () 방법 은 방금 새로 만 든 스 레 드 에 의 해 실 행 된 것 이 아니 라 이 새 스 레 드 를 만 든 스 레 드 에 의 해 실 행 된 것 입 니 다.다시 말 하면 run () 방법 을 실행 하 는 스 레 드 는 상기 두 줄 코드 를 실행 한 스 레 드 입 니 다.새 스 레 드 new Thread 에서 MyRunnable 인 스 턴 스 의 run () 방법 을 실행 하기 위해 서 는 new Thread. start () 방법 을 사용 해 야 합 니 다.
나 는 모두 에 게 이 결론 을 증명 하기 위해 코드 를 써 서 이 현상 을 재현 했다.다음은 제 가 쓴 Thread 의 하위 클래스 와 main () 방법 입 니 다.
    public class MyThread extends Thread{
        public static void main(String[] args) {
            //         
            Thread.currentThread().setName("main thread");

            MyThread myThread1 = new MyThread();
            myThread1.setName("new thread1");
            MyThread myThread2 = new MyThread();
            myThread2.setName("new thread2");

            myThread1.run();
            myThread2.start();
        }

        @Override
        public void run() {
            String name = Thread.currentThread().getName();
            System.out.println(name);
        }
    } 

인쇄 된 결 과 는:
    main thread
    new thread2

이 를 통 해 my Thread 1. run () 을 호출 한 후에 run () 방법 을 실행 하 는 것 이 main 스 레 드 (즉, my Thread 1 스 레 드 를 만 드 는 스 레 드) 임 을 증명 할 수 있 습 니 다.
스 레 드 이름
스 레 드 를 만 든 후에 이 스 레 드 의 이름 을 지 을 수 있 습 니 다.이 이름 은 우리 가 서로 다른 라인 을 구별 하 는 데 도움 을 줄 수 있다.예 를 들 어 여러 스 레 드 가 System. out 을 통 해 텍스트 를 인쇄 했 습 니 다. 스 레 드 이름 을 통 해 우 리 는 어느 스 레 드 가 인쇄 된 텍스트 인지 쉽게 알 수 있 습 니 다.다음은 하나의 예 이다.
    Thread thread = new Thread("New Thread") {
        public void run() {
            System.out.println("run by" + getName());       
        }
    };
    thread.start();
    System.out.println(thread.getName);

문자열 'New Thread' 를 매개 변수 로 Thread 에 전달 하 는 구조 방법 에 주의 하 십시오.이 문자열 이 스 레 드 의 이름 입 니 다.이 이름 은 Thread 의 getName () 방법 으로 얻 을 수 있 습 니 다.Runnable 의 실현 클래스 를 사용 할 때 도 Thread 의 구조 방법 에 이름 을 전달 할 수 있 습 니 다.다음은 대략적인 코드 구현 입 니 다.
    MyRunnable runnable = new MyRunnable();
    Thread thread = new Thread(runnable, "New Thread");

    thread.start();
    System.out.println(thread.getName());

그러나 주의해 야 할 것 은 MyRunnable 류 는 Thread 의 하위 클래스 가 아니 라 현재 실행 중인 라인 의 getName () 방법 에 접근 할 수 없습니다.현재 실행 중인 라인 의 인용 을 아래 의 방식 으로 가 져 올 수 있 습 니 다:
    Thread.currentThread();

따라서 현재 실행 중인 스 레 드 의 이름 을 아래 방법 으로 가 져 올 수 있 습 니 다.
    String threadName = Thread.currentThread().getName();

자바 스 레 드 의 예
다음은 작은 예 다.먼저 main () 방법 을 실행 하 는 스 레 드 이름 을 출력 합 니 다.이 스 레 드 는 JVM 에서 분 배 됩 니 다.그리고 이 스 레 드 는 10 개의 스 레 드 를 시작 하여 스 레 드 이름 으로 숫자 를 줍 니 다.모든 스 레 드 는 자신의 스 레 드 이름 을 인쇄 하고 마지막 으로 실 행 됩 니 다.
    public class ThreadExample {
        public static void main(String[] args){
            System.out.println(Thread.currentThread().getName());
            for(int i=0; i<10; i++){
                new Thread("" + i){
                    public void run(){
                        System.out.println("Thread: " + getName() + " running");
                    }
                }.start();
            }
        }
    }

스 레 드 가 시작 되 는 순서 가 (0, 1, 2, 3, 4 등) 이 더 라 도 실행 할 때 순서 가 아 닐 수 있 습 니 다. 스 레 드 0 은 System. out 을 통 해 스 레 드 이름 을 출력 하 는 첫 번 째 스 레 드 가 아 닐 수 있 습 니 다.이것 은 라인 이 원칙적으로 병행 집행 이지 순서 집행 이 아니 기 때문이다.JVM 또는 / 운영 체제 가 스 레 드 실행 순 서 를 결정 합 니 다.스 레 드 가 실행 되 는 순 서 는 시작 순서 와 필연 적 인 연관 이 없다.
다음: 경쟁 조건 과 임계 구역

좋은 웹페이지 즐겨찾기