자바 높은 동시성 시리즈 - 일 11 : 여러 가지 방법으로 중단 된 스레드

11 개 기사의 높은 동시성 자바 시리즈.

이 논문은 스레드를 중단하는 방법에 대해 설명합니다.

변수 스레드 인터럽트를 제어함으로써

코드 :

package com.itsoku.chat05;

import java.util.concurrent.TimeUnit;

/**
 * 微信公众号:路人甲Java,专注于java技术分享(带你玩转 爬虫、分布式事务、异步消息服务、任务调度、分库分表、大数据等),喜欢请关注!
 */
public class Demo1 {

    public volatile static boolean exit = false;

    public static class T extends Thread {
        @Override
        public void run() {
            while (true) {
                //循环处理业务
                if (exit) {
                    break;
                }
            }
        }
    }

    public static void setExit() {
        exit = true;
    }

    public static void main(String[] args) throws InterruptedException {
        T t = new T();
        t.start();
        TimeUnit.SECONDS.sleep(3);
        setExit();
    }
}

코드는 스레드의 스레드 실행 방법은, 죽음의주기를 가지고 시작 변수의 종료 값을 통해 내부 통제의 종료 여부. TimeUnit.SECONDS.sleep(3);왜 TimeUnit와 주요 스레드는 여기에, 3 초 동안 잠을? TimeUnit와 사용이 편리, 매우 명확 수면 시간을 조절하거나, 달성 기본 Thread.sleep를 변환 할 수 있습니다. 에 초점을 맞춘 프로그램이 있습니다 : 휘발성 이 제거 된 경우 키워드가 종료 변수이 수정 통과해야 프로그램이 제대로 종료 할 수 없습니다. 다중 스레드 변수의 가시성 휘발성 제어, 휘발성 프리젠 테이션의 전면에있는 문서, 여기서 다시 그 말을하지 않습니다.

인터럽트 플래그 제어를 통해 제공 스레드

샘플 코드 :

package com.itsoku.chat05;

import java.util.concurrent.TimeUnit;

/**
 * 微信公众号:路人甲Java,专注于java技术分享(带你玩转 爬虫、分布式事务、异步消息服务、任务调度、分库分表、大数据等),喜欢请关注!
 */
public class Demo2 {

    public static class T extends Thread {
        @Override
        public void run() {
            while (true) {
                //循环处理业务
                if (this.isInterrupted()) {
                    break;
                }
            }
        }
    }


    public static void main(String[] args) throws InterruptedException {
        T t = new T();
        t.start();
        TimeUnit.SECONDS.sleep(3);
        t.interrupt();
    }
}

위의 프로그램을 실행, 프로그램은 정상적으로 완료 할 수 있습니다. 호출 thread의 인터럽트 () 인스턴스 메소드는, 플래그를 중단 할 스레드가 true로 설정되어 내부 스레드 인터럽트 플래그는, () 인스턴스 메소드 isInterrupted 스레드에 의해 스레드 인터럽트 플래그가 가져옵니다이다.

차단 된 스레드를 중단하는 방법

샘플 코드 :

package com.itsoku.chat05;

import java.util.concurrent.TimeUnit;

/**
 * 微信公众号:路人甲Java,专注于java技术分享(带你玩转 爬虫、分布式事务、异步消息服务、任务调度、分库分表、大数据等),喜欢请关注!
 */
public class Demo3 {

    public static class T extends Thread {
        @Override
        public void run() {
            while (true) {
                //循环处理业务
                //下面模拟阻塞代码
                try {
                    TimeUnit.SECONDS.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }


    public static void main(String[] args) throws InterruptedException {
        T t = new T();
        t.start();
    }
}

위의 코드를 실행, 프로그램은 끝을 찾을 수 없습니다.

처음에 몇 가지 지식을 추가합니다 :

  1. 스레드 플래그를 중단 호출 스레드의 인터럽트 () 인스턴스 메소드가 true로 설정되어
  2. 스레드가 차단되는 경우, 호출 스레드의 인터럽트 () 인스턴스에있어서, 상기 내부 스레드의 InterruptedException 예외를 트리거하고, 암나사 아직 클리어한다 (플래그를 중단하려고 false로 설정된다)

그리고 나서 상기 코드는 다음과 같이 슬립 방법에 의한 폐색을 방해 코드를 조정의 InterruptedException 예외를 개시하기 위해 스레드 인터럽트 () 메소드를 호출 할 수있다 :

package com.itsoku.chat05;

import java.util.concurrent.TimeUnit;

/**
 * 微信公众号:路人甲Java,专注于java技术分享(带你玩转 爬虫、分布式事务、异步消息服务、任务调度、分库分表、大数据等),喜欢请关注!
 */
public class Demo3 {

    public static class T extends Thread {
        @Override
        public void run() {
            while (true) {
                //循环处理业务
                //下面模拟阻塞代码
                try {
                    TimeUnit.SECONDS.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    this.interrupt();
                }
                if (this.isInterrupted()) {
                    break;
                }
            }
        }
    }


    public static void main(String[] args) throws InterruptedException {
        T t = new T();
        t.start();
        TimeUnit.SECONDS.sleep(3);
        t.interrupt();
    }
}

결과 :

java.lang.InterruptedException: sleep interrupted
    at java.lang.Thread.sleep(Native Method)
    at java.lang.Thread.sleep(Thread.java:340)
    at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)
    at com.itsoku.chat05.Demo3$T.run(Demo3.java:17)

프로그램은 몇 가지주의, 위의 코드를 분석, 정상적으로 완료 할 수 있습니다 :

  1. 암나사 t 인터럽트 플래그가 true로 설정되어있는 메인 메소드 호출 t.interrupt () 메소드
  2. 다음 실행 ()의 InterruptedException 예외 내부에있어서, 이렇게 비정상적인 출력에서 동작 결과를 트리거가 말한다 내부 스레드 인터럽트 플래그를 클리어한다 트리거 이상 예외 : InterruptedException은 (거짓이된다) 할 때, 그것은 캐치도 this.interrupt ()를 호출 한 번은 , 인터럽트 플래그가 거짓으로 설정되고
  3. this.isInterrupted () 스레드 인터럽트 플래그를 통해 얻을 수 () 메소드를 실행 루프 (휴식) 종료

개요

  1. 스레드 상태가 차단 될 때 또는 차단 작업을 수행하기 위해, 당신이 사용할 수있는 Thread.interrupt()이 시간이 발생합니다주의, 스레드를 중단하는 방법을 예외 : InterruptedException을 인터럽트 상태가 초기화됩니다 상태가 아닌 상태로 인터럽트 상태에 의해 중단 (이상 )
  2. 스레드가 인터럽트와 같은 가변 제어 신호를 통해 내부 루프는, 주목 휘발성 변수 수정해야
  3. 당신이 유연성을 결합 할 수있는 방법의 텍스트는 스레드 인터럽트 컨트롤을 사용하는

높은 동시성의 자바 시리즈

최신 기사를 얻을 javacode2018 : 높은 동시성 자바의 시리즈는, 총 대중 번호에 대해 우려하는 네다섯 기사가있을 것입니다 추정했다.

추천

출처www.cnblogs.com/itsoku123/p/11199076.html