package com.javarush.task.task16.task1628;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
/*
Кто первый встал - того и тапки
*/
public class Solution {
public static volatile AtomicInteger readStringCount = new AtomicInteger(0);
public static volatile BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
public static void main(String[] args) throws IOException {
//read count of strings
int count = Integer.parseInt(reader.readLine());
//init threads
ReaderThread consoleReader1 = new ReaderThread();
ReaderThread consoleReader2 = new ReaderThread();
ReaderThread consoleReader3 = new ReaderThread();
consoleReader1.start();
consoleReader2.start();
consoleReader3.start();
while (count > readStringCount.get()) {
}
consoleReader1.interrupt();
consoleReader2.interrupt();
consoleReader3.interrupt();
System.out.println("#1:" + consoleReader1);
System.out.println("#2:" + consoleReader2);
System.out.println("#3:" + consoleReader3);
reader.close();
}
public static class ReaderThread extends Thread {
private List<String> result = new ArrayList<String>();
public void run() {
String string;
try {
while (!Thread.currentThread().isInterrupted()) {
if ((string = reader.readLine()) != null) {
result.add(string);
readStringCount.incrementAndGet();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public String toString() {
return result.toString();
}
}
}
и мое
public void run() {
try {
int belka = 0;
while (!Thread.currentThread().isInterrupted()) {
String s = reader.readLine();
if (s != null) {
result.add(s);
readStringCount.getAndIncrement();
}
}
} catch (IOException e) {
}
}
@Override
public String toString() {
return result.toString();
}
}
БелК в труселях
35 уровень
Доброе утро. Пожалуйста, объясните почему после isInterrupted() я все равно могу вводить текст ЭТО РЕШЕНИЕ НЕ СМОТРИТЕ!
Обсуждается
Комментарии (4)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Ksenia Volkova Java Developer в DXC Master
25 ноября 2021, 08:53
Если нить уже зашла внутрь цикла while, но в reader еще нет данных для считывания, она будет ждать, когда они появятся. Тем временем может быть вызван interrupt(), но поскольку нить уже внутри цикла, она продолжит работать (ждать данные для считывания). И только перед новой итерацией цикла while она узнает, что ее успели прервать.
+3
БелК в труселях
25 ноября 2021, 17:18
Ксения большое ВАМ СПАСИБО
0
hidden #598481
25 ноября 2021, 08:52полезный
У тебя главный поток находится в состоянии гонки с остальными потоками.
Главный поток получит команду на установку флага прерванности остальным потокам, когда они прочитают заданное число строк, но чтобы он выполнил эту команду, он должен сначала получить процессорное время, которое сначала может быть отдано одному или нескольким потокам ReadingThread. То есть этот поток или потоки чтения могут успеть войти в очередную итерацию своего цикла while и обратиться к ридеру до того, как основной поток фактически успеет установить ему флаг isInterrupted.
+2
БелК в труселях
25 ноября 2021, 17:17
СПАСИБО ТЕПЕРЬ ПОНЯТНО.
0