это кажется более элегантным решением, особенно если учесть, что я раньше не использовал ScheduledExecutorService. Но я все еще изо всех сил пытаюсь собрать все части вместе! Я не уверен, если и когда рабочий вызван для его обратного отсчета 45 секунд? Кроме того, мое намерение состоит в том, чтобы такой работник перезапустил обратный отсчет, как только он встретил строку стандартного вывода, по сути, сбросив обратный отсчет до нового 45-секундного окна. Помогает ли это уточнить.
Пока я работаю над включением ScheduledExecutorService в свое решение, вот весь пример кода, который я использовал для его репликации с использованием потоков. Дай мне знать, если я получу это раньше, чем смогу. Я могу вызывать поток на каждой новой строке stdout, с которой сталкиваюсь, но не могу корректно обработать случай, когда не происходит прерывания для объявленного временного окна :( Надеюсь, комментарии в коде достаточно подробны, чтобы передать мои намерения, иначе, пожалуйста, позвольте мне знаю, и я мог бы уточнить:
import java.io.BufferedReader;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.channels.Channels;
public class InterruptInput {
static BufferedReader in = new BufferedReader(
new InputStreamReader(
Channels.newInputStream(
(new FileInputStream(FileDescriptor.in)).getChannel())));
boolean TimeUp = false;
public static void main(String args[]) {
try {
System.out.println("Enter lines of input (user ctrl+Z Enter to terminate):");
System.out.println("(Input thread will be interrupted in 10 sec.)");
// interrupt input in 10 sec
String line = in.readLine();
while ((line.compareTo("") != 0)) {
System.out.println("Read line:'"+line+"'");
TimeOut ti = new TimeOut();
Thread t = new Thread(ti);
t.start();
if((line = in.readLine()) != null) {
t.interrupt();
}
}
System.out.println("outside the while loop");
} catch (Exception ex) {
System.out.println(ex.toString()); // printStackTrace();
}
}
public static class TimeOut extends Thread {
int sleepTime = 10000;
private volatile Thread threadToInterrupt;
public TimeOut() {
// interrupt thread that creates this TimeOut.
threadToInterrupt = Thread.currentThread();
setDaemon(true);
}
public void run() {
System.out.println("starting a new run of the sleep thread!!");
try {
sleep(10000); // wait 10 sec
} catch(InterruptedException ex) {/*ignore*/
System.out.println("TimeOut thread interrupted!!");
//I need to exit here if possible w.out executing
//everything after the catch block
}
//only intend to come here when the 10sec wait passes
//without interruption. Not sure if its plausible
System.out.println("went through TimeOut without interruption");
//TimeUp = true;
}
}
}