Условие задачи:
Клубок
1. Создай 5 различных своих нитей (наследников класса Thread):
1.1. Нить 1 должна бесконечно выполняться;
1.2. Нить 2 должна выводить "InterruptedException" при возникновении исключения InterruptedException;
1.3. Нить 3 должна каждые полсекунды выводить "Ура";
1.4. Нить 4 должна реализовать интерфейс Message, при вызове метода showWarning нить должна останавливаться;
1.5. Нить 5 должна читать с консоли числа пока не введено слово "N", а потом вывести в консоль сумму введенных чисел.
2. В статическом блоке добавь свои нити в List<Thread> threads в перечисленном порядке.
3. Нити не должны стартовать автоматически.
Подсказка:
Нить 4 можно проверить методом isAlive()
Requirements:
1. Статический блок класса Solution должен создавать и добавлять 5 нитей в список threads.
2. Нити из списка threads не должны стартовать автоматически.
3. Нить 1 из списка threads должна бесконечно выполняться.
4. Нить 2 из списка threads должна выводить "InterruptedException" при возникновении исключения InterruptedException.
5. Нить 3 из списка threads должна каждые полсекунды выводить "Ура".
6. Нить 4 из списка threads должна реализовать интерфейс Message, при вызове метода showWarning нить должна останавливаться.
7. Нить 5 из списка threads должна читать с консоли числа пока не введено слово "N", а потом вывести в консоль сумму введенных чисел.
Моё решение:
package com.javarush.task.task16.task1632;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/*
Клубок
*/
public class Solution {
public static List<Thread> threads = new ArrayList<>(5);
static {
threads.add(new MyThread(1));
threads.add(new MyThread(2));
threads.add(new MyThread(3));
threads.add(new MyThread(4));
threads.add(new MyThread(5));
}
public static void main(String[] args) {
/* for (int i = 0; i < threads.size(); i++) {
threads.get(i).start();
}*/
}
public static class MyThread extends Thread implements Message {
@Override
public void showWarning() {
if(this.isAlive()) {
this.interrupt();
}
}
int number;
public MyThread(int number) {
this.number = number;
}
@Override
public void run() {
switch (this.number) {
case 1:
methodForFirstThread();
break;
case 2:
methodForSecondThread();
break;
case 3:
methodForThirdThread();
break;
case 4:
methodForFourthThread();
break;
case 5:
methodForFifthThread();
break;
}
}
public void methodForFirstThread() {
int a = 0;
while (true) {
a++;
}
}
public void methodForSecondThread() {
try {
while (true) {
sleep(500);
}
} catch (InterruptedException e) {
System.out.println("InterruptedException");
}
}
public void methodForThirdThread() {
while (true) {
System.out.println("Ура");
try {
sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void methodForFourthThread() {
while(true) {
if(this.isInterrupted()) {
return;
}
}
}
public void methodForFifthThread() {
int a = 0;
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextInt()) {
a += scanner.nextInt();
}
while (scanner.hasNextLine()) {
if (scanner.nextLine().equals("N")) {
System.out.println(a);
}
}
}
}
}
Вопрос: насколько корректно использовать такой подход (создавать в классе-наследнике Thread разные методы, и вызывать один из них, в зависимости от аргумента в конструкторе нити?
Спрашиваю, потому что у меня один раз уже прошло некорректное решение как правильное. Сама не до конца уверена, что в моем решении нет подвоха
невозможносложно. поэтому начали с простейших таких кирпичиков. с Runnable - да, будете работать. а вот наследоваться напрямую от Thread-а - скорее всего нет) все примеры, которые я видела ранее были примерно такими: есть класс, наследующий Thread или имлементирующий Runnable, в его методе run() мы пишем логику объекта. этот пример такой же, как по мне. вы переопределили run() и расписали в нем логику :) то, что использовали для этого отдельную переменную - думаю норм (не помню что именно там в задаче просили сделать, поэтому не могу сказать пройдет ли такой код тестирование). как минимум, это красивее, чем, например, в каждом треде пытаться понять что это за тред сравнивая себя с тредами в переменной Solution.threads но лично я бы сейчас разделил бы логику так, чтобы у каждой нити был свой класс (пусть даже анонимный если получится), в каждом из которых я переопределил бы метод run() по-своему. тогда в статическом блоке накидал бы объекты разных классов просто и все.