> 类库下载 > java类库 > JAVA 동시 프로그래밍 인터럽트

JAVA 동시 프로그래밍 인터럽트

高洛峰
풀어 주다: 2016-11-04 15:59:13
원래의
1827명이 탐색했습니다.

소위 인터럽트 작업: 실제로 실행 중인 스레드를 인터럽트하지 않고 인터럽트 요청만 발행한 후 스레드가 다음 적절한 순간에 스스로 인터럽트합니다.

인터럽트 요청을 한 번 호출하고 다시 호출하여 인터럽트 상태를 복원합니다.

1. 인터럽트에 응답합니다.

인터럽트 예외를 처리합니다.

1>전송 예외

2>중단된 상태를 복원

프로그램의 응답 여부에 따라 제한된 시간 내에 작업을 실행하는 예입니다. 인터럽트가 발생하면 이 메소드를 호출하여 결과를 얻을 수 있습니다.

는 지정된 시간 내에 처리 결과를 얻을 수 있다는 의미입니다. 결과는 스스로 정의할 수 있습니다

package cn.study.concurrency;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * 
 * @author xiaof
 *
 */
public class TimeCount {
    
    private static final ScheduledExecutorService cancelExec = Executors.newSingleThreadScheduledExecutor();
    /**
     * 
     * @param r    线程
     * @param timeout    任务超时限定
     * @param unit    时间单元
     * @throws Throwable 
     */
    public static void timedRun(final Runnable r, long timeout, TimeUnit unit) throws Throwable
    {
        class RethrowableTask implements Runnable
        {
            //抛出的异常
            private volatile Throwable t;

            @Override
            public void run() {
                try {
                    r.run();
                } catch (Throwable e) {
                    this.t = e;
                }
            }
            /**
             * 当运行超时,或者程序运行正常退出的时候,后面进行控制的时候调用这个返回给调用者
             * @throws Throwable
             */
            void rethrow() throws Throwable
            {
                //这个t可以自己包装,或者返回其他数据,这个可以根据不同的业务来定
                //这里甚至可以保持当前状态到本地,在下次运行的时候,先读取本地数据,恢复到当前状态,留到以后操作
                if(t != null)
                    throw t;
            }
        }
        RethrowableTask task = new RethrowableTask();
        final Thread taskThread = new Thread(task);
        taskThread.start(); //启动外部线程
        cancelExec.schedule(new Runnable()
                            {
                                public void run()
                                {
                                    //启动中断异常
                                    taskThread.interrupt();
                                }
                            }, timeout, unit);
        //等待线程的终止,用来应对即使任务不响应中断,限定时间一到,最后仍可以抛出异常到这个方法的调用者
        taskThread.join(unit.toMillis(timeout));
        //抛出异常
        task.rethrow();
    }
}
로그인 후 복사


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿