На последний сданный вариант решения не смотрите. Он появился в результате того, что более лаконичный вариант выкидывает исключение.
Смотрите вот на этот вариант:
public class TaskManipulator implements Runnable, CustomThreadManipulator {
private Thread customThread;
@Override
public void start(String threadName) {
customThread = new Thread(this, threadName);
customThread.start();
}
@Override
public void stop() {
customThread.interrupt();
}
@Override
public void run() {
while (!customThread.isInterrupted()) {
System.out.println(customThread.getName());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Этот вариант кидает следующее исключение:
java.lang.InterruptedException: sleep interrupted
at java.base/java.lang.Thread.sleep(Native Method)
at com.javarush.task.task25.task2508.TaskManipulator.run(TaskManipulator.java:22)
at java.base/java.lang.Thread.run(Thread.java:834)
В гугле вычитал, что я пытаюсь прервать нить, которая спит. Чтобы обойти этот пробовал вводить дополнительную переменную, дополнительную нить демон, пробовал проверять в цикле статус нити, чтобы дождаться завершения статуса таймвейт. Сдать задачу валидатору не получалось и полез в подсказки. Скопировал себе вот такой код:
public class TaskManipulator implements Runnable, CustomThreadManipulator {
private Thread thread;
@Override
public void run() {
while(!thread.isInterrupted()){
System.out.println(Thread.currentThread().getName());
try{
Thread.sleep(100);
} catch(InterruptedException ie){
}
}
}
@Override
public void start(String threadName){
thread = new Thread(this, threadName);
thread.start();
}
@Override
public void stop(){
thread.interrupt();
}
}
И он работает! Он не выкидывает исключение, что я пытаюсь завершить спящую нить. В чём разница с моим кодом? Я уже сильно уставший от этой задачи и не вижу!package com.javarush.task.task25.task2508;
/*
Не валять дурака
*/
public class Solution
{
/*
Output:
first
first
second
second
second
third
fifth
*/
public static void main(String[] args) throws InterruptedException {
CustomThreadManipulator manipulator = new TaskManipulator();
manipulator.start("first");
Thread.sleep(150);
manipulator.stop();
manipulator.start("second");
Thread.sleep(290);
manipulator.stop();
manipulator.start("third");
Thread.sleep(90);
manipulator.stop();
manipulator.start("forth");
manipulator.stop();
manipulator.start("fifth");
Thread.sleep(90);
manipulator.stop();
}
}