Multitreading

Несколько заданий из квеста Multitreading

/*
  Реализуй логику метода interrupt, который должен прерывать трэд предварительно закрыв используемые ресурсы.
Используй метод super-класса в блоке finally.
 Требования:
 •
 Сигнатуру метода interrupt менять нельзя. 
•
 Метод interrupt должен закрывать используемые классом Solution ресурсы. 
•
 Затем, метод interrupt должен прерывать трэд (вызов super.interrupt). 
•
 Трэд должен быть прерван в любом случае, даже если во время закрытия ресурсов было выкинуто исключение. 
 
 
 ///////////////////////////////////////////////////////////////////
*/
package com.javarush.task.task25.task2507;

import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;

/* 
Работать в поте лица!
*/
public class Solution extends Thread {
    private static final int BUFFER_SIZE = 2000;    //2000 bytes
    private final Socket socket;
    private final InputStream in;

    public Solution(Socket socket) throws IOException {
        this.socket = socket;
        this.in = socket.getInputStream();
    }

    public void interrupt() {
        //implement logic here
    }

    public void run() {
        try {
            byte[] buf = new byte[BUFFER_SIZE];
            while (true) {
                int count = in.read(buf);
                if (count < 0) {
                    break;
                } else {
                    if (count > 0) {
                        //process buffer here
                    }
                }
            }
        } catch (IOException ignored) {}
    }

    public static void main(String[] args) {
    }
}  

Следующее задание:

/* 
1. Почитай про java.util.concurrent.Phaser.
2. Расставь методы в нужных местах:
- arriveAndDeregister() - начинает запускать методы run у тасок,
- arriveAndAwaitAdvance() - ждет, когда все трэды будут созданы.
 Пример вывода см. в output.txt.
Логика:
Сначала все персонажи присоединяются к игре.
После того, как все персонажи присоединятся к игре и готовы играть, выводится фраза "Игра началась!".
После этого персонажи вступают в игру, после чего умирают.
 Требования:
 •
 Класс Character менять не нужно. 
•
 Классы Plant и Zombie менять не нужно. 
•
 В классе Solution вызови метод phaser.arriveAndDeregister в правильном месте. 
•
 В классе Solution вызови метод phaser.arriveAndAwaitAdvance в правильном месте. 
 
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
*/
package com.javarush.task.task28.task2809;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Phaser;

/* 
Plants vs Zombies
*/
public class Solution {
    public static void main(String[] args) throws InterruptedException {
        List<Character> characters = new ArrayList<>();
        characters.add(new Plant());
        characters.add(new Plant());
        characters.add(new Zombie());
        characters.add(new Zombie());
        characters.add(new Zombie());
        start(characters);
    }

    private static boolean isEveryoneReady = false;

    private static void start(List<Character> characters) throws InterruptedException {
        final Phaser phaser = new Phaser(1 + characters.size());

        for (final Character character : characters) {
            final String member = character.toString();
            System.out.println(member + " присоединился к игре");
            new Thread() {
                @Override
                public void run() {
                    System.out.println(member + " готовится играть");
                    if (!isEveryoneReady) {
                        isEveryoneReady = true;
                        System.out.println("Игра началась!");
                    }
                    character.run();
                }
            }.start();
        }
    }
}

 
 ///////////////////////////////////////////////////////////////////package com.javarush.task.task28.task2809;

import java.util.concurrent.atomic.AtomicInteger;

public class Zombie extends Character {
    private final static AtomicInteger idSequence = new AtomicInteger();
    private final int id = idSequence.incrementAndGet();

    protected int getId() {
        return id;
    }
}

 
 ///////////////////////////////////////////////////////////////////

package com.javarush.task.task28.task2809;

import java.util.concurrent.ThreadLocalRandom;

public abstract class Character implements Runnable {
    protected abstract int getId();

    public void run() {
        System.out.println(toString() + " вступил в игру");
        doSomething();
        System.out.println(toString() + " умер");
    }

    private void doSomething() {
        try {
            Thread.currentThread().sleep(ThreadLocalRandom.current().nextInt(10, 100));
        } catch (InterruptedException ignored) {
        }
    }

    @Override
    public String toString() {
        return getClass().getSimpleName() + " #" + getId();
    }

}

 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

.txt

Plant #1 присоединился к игре
Plant #2 присоединился к игре
Plant #1 готовится играть
Zombie #1 присоединился к игре
Zombie #2 присоединился к игре
Zombie #3 присоединился к игре
Plant #2 готовится играть
Zombie #2 готовится играть
Zombie #1 готовится играть
Zombie #3 готовится играть
Игра началась!
Zombie #1 вступил в игру
Zombie #3 вступил в игру
Plant #1 вступил в игру
Zombie #2 вступил в игру
Plant #2 вступил в игру
Zombie #2 умер
Plant #2 умер
Plant #1 умер
Zombie #3 умер
Zombie #1 умер
 ///////////////////////////////////////////////////////////////////

package com.javarush.task.task28.task2809;

import java.util.concurrent.atomic.AtomicInteger;

public class Plant extends Character {
    private final static AtomicInteger idSequence = new AtomicInteger();
    private final int id = idSequence.incrementAndGet();

    protected int getId() {
        return id;
    }
} 

Syntax

Несколько заданий из квеста Syntax

/*
 Задача: Пользователь вводит с клавиатуры список слов (и чисел).
Слова вывести в возрастающем порядке, числа - в убывающем.
 Пример ввода:
Вишня
1
Боб
3
Яблоко
22
0
Арбуз
 Пример вывода:
Арбуз
22
Боб
3
Вишня
1
0
Яблоко
 Требования:
 •
 Программа должна считывать данные с клавиатуры. 
•
 Программа должна выводить данные на экран. 
•
 Выведенные слова должны быть упорядочены по возрастанию (используй готовый метод isGreaterThan). 
•
 Выведенные числа должны быть упорядочены по убыванию. 
•
 Метод main должен использовать метод sort. 
•
 Метод sort должен использовать метод isGreaterThan. 
•
 Метод sort должен использовать метод isNumber. 
 
 
 ///////////////////////////////////////////////////////////////////
*/
package com.javarush.task.task09.task0930;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;

/* 
Задача по алгоритмам
*/

public class Solution {
    public static void main(String[] args) throws Exception {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        ArrayList<String> list = new ArrayList<>();
        while (true) {
            String s = reader.readLine();
            if (s.isEmpty()) {
                break;
            }
            list.add(s);
        }

        String[] array = list.toArray(new String[0]);
        sort(array);

        for (String x : array) {
            System.out.println(x);
        }
    }

    public static void sort(String[] array) {
        // напишите тут ваш код
    }

    // Метод для сравнения строк: 'а' больше чем 'b'
    public static boolean isGreaterThan(String a, String b) {
        return a.compareTo(b) > 0;
    }


    // Переданная строка - это число?
    public static boolean isNumber(String s) {
        if (s.length() == 0) {
            return false;
        }

        char[] chars = s.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            char c = chars[i];
            if ((i != 0 &amp;&amp; c == '-') // Строка содержит '-'
                    || (!Character.isDigit(c) &amp;&amp; c != '-') // или не цифра и не начинается с '-'
                    || (chars.length == 1 &amp;&amp; c == '-')) // или одиночный '-'
            {
                return false;
            }
        }
        return true;
    }
} 

Следующее задание:

/*
По аналогии с классом Duck (утка) создай классы Cat (кошка) и Dog (собака).
Подумай, что должен возвращать метод toString в классах Cat и Dog?
В методе main создай по два объекта каждого класса и выведи их на экран.
Объекты класса Duck уже созданы и выводятся на экран.
 Требования:
 •
 Создай класс Cat(кошка). 
•
 Создай класс Dog(собака). 
•
 У класса Cat должен быть верно реализован метод toString. 
•
 У класса Dog должен быть верно реализован метод toString. 
•
 В методе main создай два объекта типа Cat. 
•
 В методе main создай два объекта типа Dog. 
•
 Выведи все созданные объекты на экран. 
 
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
*/
package com.javarush.task.task05.task0525;

/* 
И целой утки мало
*/

public class Solution {

    public static void main(String[] args) {
        Duck duck1 = new Duck();
        Duck duck2 = new Duck();
        System.out.println(duck1);
        System.out.println(duck2);

        //напишите тут ваш код
    }

    public static class Duck {
        public String toString() {
            return "Duck";
        }
    }

    //напишите тут ваш код
}

Еще задание:

/*
 1. Внутри класса Solution создай public static классы Man и Woman.
2. У классов должны быть поля: name(String), age (int), address (String).
3. Создай конструкторы, в которые передаются все возможные параметры.
4. Создай по два объекта каждого класса со всеми данными используя конструктор.
5. Объекты выведи на экран в таком формате: name + " " + age + " " + address
 Требования:
 •
 В классе Solution создай public static класс Man. 
•
 В классе Solution создай public static класс Woman. 
•
 Класс Man должен содержать переменные: name(String), age(int) и address(String). 
•
 Класс Woman должен содержать переменные: name(String), age(int) и address(String). 
•
 У классов Man и Woman должны быть конструкторы, принимающие параметры с типами String, int и String. 
•
 Конструкторы должны инициализировать переменные класса. 
•
 В методе main необходимо создать по два объекта каждого типа. 
•
 Метод main должен выводить созданные объекты на экран в указанном формате. 
 
 
 ///////////////////////////////////////////////////////////////////
*/
package com.javarush.task.task05.task0526;

/* 
Мужчина и женщина
*/

public class Solution {
    public static void main(String[] args) {
        //напишите тут ваш код
    }

    //напишите тут ваш код
}

И еще задание:

/*
Написать функцию, которая вычисляет минимум из четырёх чисел.
Функция min(a,b,c,d) должна использовать (вызывать) функцию min(a,b)
 Подсказка:
Нужно написать тело двух существующих функций min.
 Требования:
 •
 Программа должна выводить текст на экран. 
•
 Методы min не должны выводить текст на экран. 
•
 Метод main должен вызывать метод min(a, b) и метод min(a, b, c, d). 
•
 Метод main должен выводить на экран результат работы методов min. Каждый раз с новой строки. 
•
 Метод min(a, b) должен возвращать минимальное значение из чисел a, b. 
•
 Метод min(a, b, c, d) должен использовать метод min(a, b) 
•
 Метод min(a, b, c, d) должен возвращать минимальное значение из чисел a, b, c, d. 
 
 
 ///////////////////////////////////////////////////////////////////
*/
package com.javarush.task.task02.task0217;

/* 
Минимум четырех чисел
*/
public class Solution {
    public static int min(int a, int b, int c, int d) {
        //напишите тут ваш код

    }

    public static int min(int a, int b) {
        //напишите тут ваш код

    }

    public static void main(String[] args) throws Exception {
        System.out.println(min(-20, -10));
        System.out.println(min(-40, -10, -30, 40));
        System.out.println(min(-20, -40, -30, 40));
        System.out.println(min(-20, -10, -40, 40));
        System.out.println(min(-20, -10, -30, -40));
    } 

Core

Несколько заданий из квеста Core

/* 1. Подумай, какой из двух интерфейсов нужно реализовать в классе BeerLover.
2. Добавь к классу BeerLover этот интерфейс и реализуй все его методы.
3. Подумай, как связаны переменная READY_TO_GO_HOME и метод isReadyToGoHome.
4. Верни значение переменной READY_TO_GO_HOME в методе isReadyToGoHome.
 Требования:
 •
 Класс BeerLover должен реализовывать(implements) интерфейс Alcoholic. 
•
 Класс BeerLover не должен реализовывать интерфейс Drinker напрямую(только опосредованно через Alcoholic) 
•
 В классе BeerLover должны быть реализованы все методы интерфейса Alcoholic. 
•
 В классе BeerLover должны быть реализованы все методы интерфейса Drinker. 
•
 Метод isReadyToGoHome должен возвращать значение переменной READY_TO_GO_HOME. 
 
 
 ///////////////////////////////////////////////////////////////////
*/
package com.javarush.task.task13.task1301;

/* 
Пиво
*/
public class Solution {
    public static void main(String[] args) throws Exception {
    }

    public interface Drinker {
        void askForMore(String message);

        void sayThankYou();

        boolean isReadyToGoHome();
    }

    public interface Alcoholic extends Drinker {
        boolean READY_TO_GO_HOME = false;

        void sleepOnTheFloor();
    }

    public static class BeerLover {

    }
} 

Еще задание:

/*
1. Переделай наследование в классах и интерфейсах так, чтобы программа компилировалась и продолжала делать то же самое.
2. Класс Hobby должен наследоваться от интерфейсов Desire, Dream.
 Требования:
 •
 Интерфейс Desire должен быть реализован в классе Hobby. 
•
 Интерфейс Dream должен быть реализован в классе Hobby. 
•
 Класс Hobby должен содержать статическую переменную INDEX. 
•
 Метод toString в классе Hobby должен инкрементировать и возвращать переменную INDEX в виде строки. 
 
 
*/
package com.javarush.task.task13.task1321;


/* 
Исправление ошибок
*/

public class Solution {

    public static void main(String[] args) {
        System.out.println(Dream.HOBBY.toString());
        System.out.println(new Hobby().INDEX);
    }

    interface Desire {
    }

    interface Dream implements Hobby {
        public static Hobby HOBBY = new Hobby();
    }

    static class Hobby extends Desire, Dream {
        static int INDEX = 1;

        @Override
        public String toString() {
            INDEX++;
            return "" + INDEX;
        }
    }

} 

И еще задание:

/*
1.Разберись, что делает программа. Официант почему-то не относит приготовленные блюда назад к столам :(
 2.Исправь ошибку.

 Требования:
 •
 Класс Restaurant должен содержать список поваров и официантов (public static поле threads типа List<Thread>). 
•
 Класс Manager должен содержать очередь с заказами (private final поле orderQueue типа Queue<Order>). 
•
 Класс Manager должен содержать очередь с готовыми блюдами (private final поле dishesQueue типа Queue<Dishes>). 
•
 Класс Manager должен реализовывать паттерн Singleton. 
•
 Класс Waiter должен реализовывать интерфейс Runnable. 
•
 Класс Cook должен реализовывать интерфейс Runnable. 
•
 Если нет готовых блюд в очереди, нить класса Waiter должна получать заказ от столика и добавлять его в очередь заказов. 
•
 Если есть готовые блюда в очереди, нить класса Waiter должна брать блюдо из очереди и относить заказ для столика. 
•
 Если нет заказов в очереди с заказами, нить класса Cook должна отдыхать (повар отдыхает). 
•
 Если есть заказы в очереди с заказами, нить класса Cook должна готовить блюдо и добавлять его в очередь с готовыми блюдами. 
 
 
 ///////////////////////////////////////////////////////////////////
*/
package com.javarush.task.task17.task1712;

import java.util.ArrayList;
import java.util.List;

/* 
Ресторан
*/

public class Restaurant {
    public static List<Thread> threads = new ArrayList<>();

    public static void main(String[] args) throws Exception {
        Waiter waiterTarget = new Waiter();
        Thread waiter = new Thread(waiterTarget);
        threads.add(waiter);

        Cook cookTarget = new Cook();
        Thread cook = new Thread(cookTarget);
        threads.add(cook);

        waiter.start();
        cook.start();

        Thread.sleep(2000);
        cookTarget.continueWorking = false;
        Thread.sleep(500);
        waiterTarget.continueWorking = false;
    }
}

 
 ///////////////////////////////////////////////////////////////////
package com.javarush.task.task17.task1712;

public class Dishes {
    private byte tableNumber;

    public Dishes(byte tableNumber) {
        this.tableNumber = tableNumber;
    }

    public byte getTableNumber() {
        return tableNumber;
    }
}

 
 ///////////////////////////////////////////////////////////////////
package com.javarush.task.task17.task1712;

public class Table {
    private static byte tableNumber;
    private byte number = ++tableNumber;

    public Order getOrder () {
        return new Order(number);
    }
}

 
 ///////////////////////////////////////////////////////////////////
package com.javarush.task.task17.task1712;

public class Order {
    private long time;
    private byte tableNumber;

    public Order(byte tableNumber) {
        time = (long) (Math.random() * 200);
        this.tableNumber = tableNumber;
    }

    public long getTime() {
        return time;
    }

    public byte getTableNumber() {
        return tableNumber;
    }
}

 
 ///////////////////////////////////////////////////////////////////
package com.javarush.task.task17.task1712;

public class Waiter implements Runnable {
    public boolean continueWorking = true;

    @Override
    public void run() {
        Manager manager = Manager.getInstance();

        while (continueWorking || !manager.getDishesQueue().isEmpty()) {
            if (!manager.getDishesQueue().isEmpty()) {       //относим готовый заказ
                Dishes dishes = manager.getDishesQueue().poll();
                System.out.println("Официант отнес заказ для стола №" + dishes.getTableNumber());
            } else {                                         //берем новый заказ
                Table table = manager.getNextTable();
                Order order = table.getOrder();
                System.out.println("Получен заказ от стола №" + order.getTableNumber());
                manager.getOrderQueue().add(order);
            }
            try {
                Thread.sleep(100);  //walking to the next table
            } catch (InterruptedException e) {
            }
        }
    }
} 

JavaRush валидатор

Устал бороться с валидатором сайта javarush.ru?


Если Вы считает что в состоянии сами проверить свой код, если Вы готовы самостоятельно писать код к задачам, то гораздо результативней и, что немаловажно, быстрее будет писать код заданий не для ублажения валидатора, а для собственного обучения.

Используйте листинги заданий в самостоятельном обучении

Мы предлагаем получить абсолютно все задания сайта Javarush в текстовом виде. Достаточно вбить их в IntelljIdea и можно приступать к решению. При этом как вы решите,  так и будет верно но  не только верными будет именно то решение, которое ожидает валидатор. 

Больше нет необходимости тратить несколько часов, а зачастую и дней, чтобы из верного решения сделать еще одно верное решение

Для получения материалов перейдите по ссылке

Стоимость материала составляет 2000 рублей.

В эту стоимость входит все необходимое для полноценного изучения языка Java и практического закрепления. Все лекции сайта открыты.Все задания доступны.Бери и учи.

 

Образцы заданий для ознакомления можно посмотреть в рубрике Задания .