ホームページ > 类库下载 > 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 までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート