第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從 BufferedReader 讀取特定 Duration

從 BufferedReader 讀取特定 Duration

白衣非少年 2022-06-04 15:15:19
所以,我正在從 BufferedReader 中閱讀。一切都很好,直到我添加一個條件。我需要從 BufferedReader 讀取特定的持續(xù)時間。這就是我現(xiàn)在正在做的事情。while ((line = br.readLine()) != null                    && System.currentTimeMillis() - start < maxReadTime.toMillis()) {     // doingSomethingHere()}問題: InputStream 即使在時間過去后仍處于活動狀態(tài)。例如 - maxReadTime 是 30 秒。輸入在 20 秒內(nèi)不斷出現(xiàn)。在接下來的 12 秒內(nèi),沒有任何活動。現(xiàn)在,當(dāng)下一個輸入到達時,流打開并僅在讀取輸入后關(guān)閉。但是,我不處理此輸入,因為 while 循環(huán)終止。我的預(yù)期或我需要的是:Stream 將在 30 秒后關(guān)閉。也就是說,當(dāng)輸入到達第 32 秒時,流被關(guān)閉并且不監(jiān)聽任何輸入。我對 ExecutorService 知之甚少。我不確定這是否是正確的方法。
查看完整描述

2 回答

?
慕俠2389804

TA貢獻1719條經(jīng)驗 獲得超6個贊

只需在從流中讀取之前設(shè)置您的計時器條件


while ((line = br.readLine()) != null) {

    boolean active = System.currentTimeMillis() - start < maxReadTime.toMillis();

    if (!active) {

        br.close();

    }         

    // doingSomethingHere()

}

在這種情況下,如果第一個條件是false(時間已到),則根本不會執(zhí)行第二個條件


查看完整回答
反對 回復(fù) 2022-06-04
?
DIEA

TA貢獻1820條經(jīng)驗 獲得超3個贊

readLine()基本上,您必須在調(diào)用方法之前檢查緩沖區(qū)是否準(zhǔn)備就緒ready(),InputStream檢查available()方法返回您可以在沒有阻塞的情況下讀取多少字節(jié)。


這里有一個例子


import java.io.*;

import java.time.Duration;


public class Main {


    public static void main(String[] args) {

        final InputStream in =  System.in; //new FileInputStream(new File("/tmp/x"));

        final String out = readInput(in, Duration.ofSeconds(5));

        System.out.printf("m=main, status=complete, out=%s%n", out);

    }


    public static String readInput(InputStream in, Duration duration) {

        final long timestamp = System.currentTimeMillis();

        final BufferedReader reader = new BufferedReader(new InputStreamReader(in));

        final StringBuilder out = new StringBuilder();

        try {

            String line = null;

            while (true){

                if(Duration.ofMillis(System.currentTimeMillis() - timestamp).compareTo(duration) >=0 ){

                    System.out.println("m=readInput, status=timeout");

                    break;

                }

                if(!reader.ready()){

                    System.out.println("m=readInput, status=not ready");

                    sleep(1000);

                    continue;

                }

                line = reader.readLine();

                if(line == null){

                    System.out.println("m=readInput, status=null line");

                    break;

                }

                out.append(line);

                out.append('\n');

                System.out.printf("m=readInput status=read, line=%s%n" , line);

            }

            return out.toString();

        } catch (IOException e){

            throw new RuntimeException(e);

        } finally {

            System.out.println("m=readInput, status=complete");

        }

    }


    static void sleep(int millis) {

        try {

            Thread.sleep(millis);

        } catch (InterruptedException e) {}

    }


}

如果您想在后臺執(zhí)行此操作,可以按照此示例進行操作


package com.mageddo;


import java.io.*;

import java.util.concurrent.*;


public class Main {


public static void main(String[] args) throws IOException, ExecutionException, InterruptedException {

        final InputStream in =  System.in; //new FileInputStream(new File("/tmp/x"));

        final StringBuilder out = new StringBuilder();

        final ExecutorService executor = Executors.newFixedThreadPool(1);

        final Future<String> promise = executor.submit(() -> readInput(in, out));

        try {

            final String result = promise.get(5, TimeUnit.SECONDS);

            System.out.printf("m=main, status=success, result=%s%n", result);

        } catch (TimeoutException e) {

            System.out.println("m=main, status=timeout");

            in.close();

            promise.cancel(true);

            System.out.println("Failed output: " + promise.get());

            e.printStackTrace();

        } finally {

            executor.shutdown();

            System.out.println("m=main, status=shutdown, out=" + out);

        }

    }


    public static String readInput(InputStream in, StringBuilder out) {

        final BufferedReader reader = new BufferedReader(new InputStreamReader(in));

        try {

            String line = null;

            while (true){

                if(Thread.currentThread().isInterrupted()){

                    System.out.println("m=readInput status=interrupt signal");

                    break;

                }

                if(!reader.ready()){

                    System.out.println("m=readInput, status=not ready");

                    sleep(1000);

                    continue;

                }

                line = reader.readLine();

                if(line == null){

                    System.out.println("m=readInput, status=null line");

                    break;

                }

                out.append(line);

                out.append('\n');

                System.out.printf("m=readInput status=read, line=%s%n" , line);

            }

            return out.toString();

        } catch (IOException e){

            throw new RuntimeException(e);

        } finally {

            System.out.println("m=readInput, status=complete");

        }

    }


    static void sleep(int millis) {

        try {

            Thread.sleep(millis);

        } catch (InterruptedException e) {

            Thread.currentThread().interrupt();

        }

    }


}


查看完整回答
反對 回復(fù) 2022-06-04
  • 2 回答
  • 0 關(guān)注
  • 128 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號