Один небольшой комментарий к вашему "найденному коду": InterruptedException
почти исключительно полезен в качестве запроса на завершение потока. Считать это нормальным исключением часто бывает ошибкой. Эта строка кода:
} catch (InterruptedException e) {
e.printStackTrace();
}
Возможно, это бесполезно, нет причин печатать трассировку стека только потому, что вас попросили выйти.
Кроме того, когда вы ловите InterruptedException
, и вы НЕ БРОСАЕТЕ ЭТО, вы должны сбросить флаг прерывания для вашего потока.
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
Это потому, что другие части кода должны знать, что они находятся в прерванном состоянии и что они должны выйти как можно скорее.
C.f. Брайан Гетц Java-параллелизм на практике