가장 완벽한 멀티 스레딩 학습 요약 1-- 자바 스레드 기반

  "자바 핵심 기술은"이 책은 매우 포괄적 인 지식 포인트, 번역 품질도 좋은 정말 좋은입니다,이 시리즈 보웬 동시에 책의 장을 요약 한 것입니다.

스레드는 무엇인가

  공식 설명 : 스레드가되는 과정에 포함 스케줄링 동작 할 수있는 운영 체제의 최소 단위는 단위 공정의 실제 동작이다. 그 스레드는 캐리어 코드 실행, 우리의 코드는 가장 간단한 hellowWorld 예 중 하나에 스레드에서 실행됩니다 :

public class Main {

    public static void main(String[] args) {
        System.out.println("Hello World!");
        System.out.println("当前线程名为:"+Thread.currentThread().getName());
        System.out.println("当前线程id为:"+Thread.currentThread().getId());
    }
}

그 결과는 다음과 같습니다

Hello World!
当前线程名为:main
当前线程id为:1

주, 스레드 ID 1 : 기본 코드를 실행할 수있는 메인 스레드를 생성, 프로그램은 제목 스레드를 실행

무엇 다중 스레드

  이름에서 알 수 있듯이 것은 여러 스레드가 동시에 실행 프로그램 실행 속도를 향상시킬 수 있다는 점이다. 단일 스레드가 하나의 일을 할 수있는 두 가지 방법의 효율성을 향상시키고 자 :

  • 비동기. 스레드가 계산에 시간이 아니다 대부분의 시간, IO 조치를 기다리고 있기 때문에, 대기 시간은 스레드의 활용을 개선하기 위해 활용 될 수있다. 너무 많은 토론을하고 Node.js를 배울 비동기에 대한 자세한 내용은하고 싶지 않아 (기본 지원 비동기)
  • 멀티 스레딩. 스레드는 다음 여러 스레드가 스레드의 수를 증가시켜 실행 속도를 증가시키는 동시에 더 많은 일을 할 수있을 것 한 가지를 할 수 있습니다.

어떻게 스레드를 만드는 방법

  스레드를 생성하는 방법은 두 가지가 있습니다

  • Thread 클래스 상속
  • 실행 가능한 인터페이스를 구현

Thread 클래스 상속

  이것은 분명한 이유를 들어, 스레드를 생성하는 방법을 권장하지 않습니다 : 당신은 Thread 클래스가 다른 클래스를 상속 상속 할 수없는 경우 자바는 다중 상속을 지원하지 않습니다.

  다음과 같이 생성 스레드 코드 상속이 사용됩니다 :

public class CustomThreadExtendThread extends Thread{

    @Override
    public void run() {
        String threadName = Thread.currentThread().getName();
        long threadId = Thread.currentThread().getId();
        System.out.println("创建线程名为:"+threadName+",id为:"+threadId);
    }

    public static void main(String[] args){
        Thread thread1 = new CustomThreadExtendThread();
        Thread thread2 = new CustomThreadExtendThread();
        thread1.start();
        thread2.start();
    }
}

실행 가능한 인터페이스를 구현

  현재 방법으로 권장 스레드를 만들 수있는 인터페이스를 구현, 이유는 간단하다 : 클래스는 여러 인터페이스를 구현할 수 있습니다. 다른 인터페이스를 구현하기 위해 이동합니다 구현 클래스에 영향을 미치지 않습니다의 Runnable 인터페이스를 구현합니다.

  인터페이스를 달성하기 위해 스레드를 만들려면 다음 코드를 사용하여 :

public class CustomThreadImplementInterface implements Runnable {
    @Override
    public void run() {
        Thread.currentThread().setName(((Double) Math.random()).toString());
        String threadName = Thread.currentThread().getName();
        long threadId = Thread.currentThread().getId();
        System.out.println("创建线程名为:" + threadName + ",id为:" + threadId);
    }

    public static void main(String[] args) {
        Thread thread1 = new Thread(new CustomThreadImplementInterface());
        Thread thread2 = new Thread(new CustomThreadExtendThread());
        thread1.start();
        thread2.start();

        //使用lambda表达式,让创建线程更简单
        new Thread(() -> {
            System.out.println("创建了一个新线程");
        }).start();
    }
}

  당신은 Thread 클래스 소스 코드를보고 실행 가능한 인터페이스 스레드를 구현하는 클래스입니다 볼 수 있습니다.

추신 : 모든 실행 가능한 스레드를 생성하는 코드를 사용하십시오

스레드 상태

  위는 스레드의 상태에 대한 자세한 내용은 지금 쓰레드 생성을 설명하고 있습니다. 자바 사양에서, 스레드는 다음의 6 개 주를 가질 수 있습니다 :

  • 새로운 (새로 생성)
  • 실행 가능한 (실행)
  • 차단 (차단)
  • 대기 (대기)
  • 시간이 초과되었습니다 대기 (대기 타이머)
  • 종료 (종료)

새로 생성 된 스레드

  스레드가 새로운 스레드 (R)와 같은 새로운 연산자를 사용하여 생성되는 경우, 스레드가 실행되고 있지 않은, 새로 생성 된 상태에 속한다.

실행 가능한 스레드

  Thread 클래스 시작 메서드 호출되면, 스레드는 실행 가능한 상태입니다.

왜 호출 할 수 있습니다 상태를 실행?

  자바 사양은 CPU에서 실행되지 않습니다 때문에 별도의 상태로 정의된다. 그래서 실행 가능한 스레드가 실행되거나 CPU 스케줄링 정책에 따라 실행되지 않을 수 있습니다.

그리고 스레드가 대기 스레드를 차단

  스레드가 차단되거나 대기 상태 때, 코드를 실행하고 최소한의 자원을 소모하지 않습니다. 다시 실행할 때까지. 차단 또는 대기 상태로 스레드지고 여러 가지 방법이 있습니다 :

  • 스레드가 내부 객체 잠금을 획득하려고 시도하고,이 때 로크 다른 스레드에 의해 유지
  • 스레드가 다른 스레드 스케줄러를 기다리고있을 때 상태가 대기 상태로 진입 통지한다. 예를 들어, 지정된 Object.wait 또는를 Thread.join 메소드를 호출하거나 라이브러리 java.util.concurrent의 잠금 상태 또는 때까지 기다립니다.
  • 때 대기 방법을 타이밍 전화. 예를 Thread.sleep를, 지정된 Object.wait,를 Thread.join, Lock.tryLock 및 Condition.await 들어

종료 스레드

  최종 상태를 입력하려면 다음 두 가지 방법에 의해 댓글 :

  • 실행 방법과 자연 죽음의 끝
  • 실행 방법과 사고사 중단 catch되지 않은

참고 : STOP 메소드 호출 스레드는 스레드를 종료 할 수 있지만,이 방법은 포기했다, 그것은 사용하지 않는 것이 좋습니다.

스레드 속성

  우선, 데몬 스레드와 스레드 그룹의 캐치되지 않는 예외 처리 프로세서 : 스레드는 다양한 특성을가집니다.

스레드 우선 순위

  자바는 각 스레드에 우선 순위를 갖는다. 기본적으로 스레드는 상위 스레드 우선 순위를 상속합니다. 또한 호출 할 수있는 setPriority방법 지정된 우선 순위를. 우선 순위 범위 : 1 (MIN_PRIORITY) -10 (MAX_PRIORITY ) .NORM_PRIORITY 5, 이러한 상수는 Thread 클래스에 정의되어 있습니다.

주 : 스레드 우선 순위 시스템에 크게 의존, 우선 순위 자바 스레드 우선 순위는 호스트 플랫폼에 매핑 할 때, 우선 순위의 수가 적은 지거나 예를 들어 0이 될 수 있도록, 윈도우 일곱 우선 순위가 자바 스레드 매핑 섹션의 우선 순위는 동일한 운영 체제 우선 순위에 매핑 할 때. 오라클 리눅스는 스레드 우선 순위를 무시하고, 자바 가상 머신에 기록 된 모든 자바 스레드가 동일한 우선 순위가 있습니다. 우선 순위를 의존하는 코드를 작성하지 마십시오 .

데몬 스레드

  호출하여 Thread.setDaemon(true)스레드를 데몬 스레드로 변환됩니다. 유일한 사용자 데몬 스레드는 스레드 타이밍 다른 스레드에 서비스를 제공하는 타이밍 신호의 타이밍은 다른 스레드에 전송된다. 가상 머신은 데몬 스레드 경우에 따라서, 가상 머신이 종료를 종료합니다. 스레드 가드의 모든 리소스에 액세스하지 마십시오, 비즈니스 로직을 처리

캐치되지 않는 예외 핸들러

  스레드 실행 방법은 / 캐치 예외를 catch 시도뿐만 아니라, 비는 예외가 스레드가 종료됩니다 확인, 어떤 예외를 확인 던질 수 없습니다뿐만 아니라 캐치되지 않는 예외 프로세서에 의해 예외를 처리 할 수 있습니다. 예외 핸들러가 구현해야하는 Thread.UncaughtExceptionHandler인터페이스를.

  사용할 수있는 스레드의 예 setUncaughtExceptionHandler()스레드의 방법 설정 프로세서는, 그것은 또한 사용할 수 있습니다 Thread.setDefaultUncaughtExceptionHandler()다음과 같이 모든 프로세서 스레드 기본 설정을 위해 :

public class CustomExceptionHandler implements Thread.UncaughtExceptionHandler {

    @Override
    public void uncaughtException(Thread t, Throwable e) {
        System.out.println("捕获到线程"+t.getName()+",异常:" + e.getMessage());
        e.printStackTrace();
    }

    public static void main(String[] args) {
        Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler());
        new Thread(() -> {
            throw new RuntimeException("test");
        }).start();
    }
}

  스레드 그룹 개체 기본 프로세서를 설정하지 않은 경우 별도의 프로세서가 설정 --ThreadGroup의 스레드에 대한 프로세서의 다음 스레드를 스레드로하지 (thread 그룹 객체가 구현하므로 Thread.UncaughtExceptionHandler인터페이스).

Benpian 모든 코드를 사용 : GitHub의

Benpian 원래 게시 됨 : https://www.tapme.top/blog/detail/2019-04-08-20-52

추천

출처www.cnblogs.com/wuyoucao/p/11100889.html