-2

私はcallableを使用してfinallyブロックで囲まれたいくつかの入力ストリームを開きます。これは、いくつかの厄介な理由で、気にしない理由で時期尚早のeof例外をスローしています。呼び出し可能オブジェクトに一定の時間を与え、終了していない場合は停止します。しかし、呼び出し可能オブジェクト内のfinallyブロック内のものをどのようにシャットオフするのですか?たとえば、次のコードでは、finallyブロック印刷「e」は実行されません。

ExecutorService e = Executors.newSingleThreadExecutor();
Future<Integer> f = e.submit(new Callable<Integer>() {
    public Integer call() {
        try {
            int i = 0;
            while(i<1) {
            }
        } finally {
            System.out.println("e");
        }
        return 4;
    }
});


try {
    Integer i = f.get(2, TimeUnit.SECONDS);
} catch(Exception ef) {
    System.out.println("l");
}
4

2 に答える 2

1

提供したコードサンプルのブロックは、ループfinallyをエスケープするための実行パスがないため、実行されません。whileループの終了条件が満たされた場合、whileまたはコードの一部が存在する可能性がある場合throwRuntimeException、sysoutが表示されます。

于 2012-04-18T17:08:29.083 に答える
1

あなたは間違った木を吠えていると思います。ストリームがソケット入力ストリームの場合は、Socket.setSoTimeout()を使用して読み取りタイムアウトを強制するか、HTTPストリームの場合はHttpURLConnection.setReadimeout()を使用する必要があります。データベースにはタイムアウトがあります。私が考えることができる読み取りでブロックできるものはすべてタイムアウトがあります。

于 2012-04-19T00:16:39.987 に答える