Рубрики
Без рубрики

Управляемый против потоков

Потоки в Java могут быть созданы двумя способами: Расширение класса потоков Реализация Управляемого Интерфейса… С тегами java, многопоточность, программирование.

Потоки в Java могут быть созданы двумя способами:

  1. Расширение класса потоков
  2. Реализация Управляемого Интерфейса

Расширение класса потоков:

class MyThread extends Thread{
    /*
    This is where your implementation of what happens when you start a thread goes.
    You need to override the run method from the Thread class.
    */
    @Override
    public void run()
    {
        System.out.println("Thread is running");
    }
}

class CreatingThreads {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();
    }
}

Реализация Управляемого Интерфейса

class MyRunnable implements Runnable{
    @Override
    public void run()
    {
        System.out.println("Thread is running");
    }
}

class CreatingThreads{
    public static void main(String[] args){
        Runnable myRunnable = new MyRunnable();
        Thread myThread = new Thread(myRunnable);
        myThread.start();
    }
}

Используя интерфейс Runnable , вы также можете создавать потоки с помощью лямбда-выражений . Класс Thread принимает объект Runnable , а интерфейс Runnable имеет только один метод run, который не принимает аргументов. Итак, вы можете создать Thread используя следующий шаблон, который намного проще реализовать.

class CreatingThreads{
    public static void main(String[] args){
        Thread myThread2 = new Thread(() -> {
        //do something here
        //what do you want your thread to do
        });
        myThread2.start();
    }
}

Преимущество реализации интерфейса Runnable перед расширением Thread class заключается в том, что у вас будет место для расширения другого класса, если потребуется. (Вы можете расширить только один класс в Java). Другим преимуществом является то, что каждый поток, созданный классом Thread , связан с новым объектом, тогда как каждый поток, созданный интерфейсом Runnable , совместно использует один и тот же объект. Давайте посмотрим на следующий код:

class MyRunnable implements Runnable{

    public int number = 0;

    @Override
    public void run() {
        number++;
        System.out.println("Thread is running, "+number);
    }

}

class MyThread extends Thread{

    public int number = 0;

    @Override
    public void run() {
        number++;
        System.out.println("Thread is running, "+number);
    }
}

class CreatingThreads{
    public static void main(String[] args) throws InterruptedException {

        System.out.println("Implementing Runnable Interface: ");

        Runnable myRunnable = new MyRunnable();
        Thread myThread = new Thread(myRunnable);
        Thread myThread2 = new Thread(myRunnable);
        myThread.start();
        Thread.sleep(2000);

        myThread2.start();
        Thread.sleep(2000);

        System.out.println();

        System.out.println("Extending Thread Class: ");

        MyThread secondMyThread = new MyThread();
        MyThread secondMyThread2 = new MyThread();
        secondMyThread.start();
        Thread.sleep(2000);
        secondMyThread2.start();

    }

}

Выход:

Implementing Runnable Interface: 
Thread is running, 1
Thread is running, 2

Extending Thread Class: 
Thread is running, 1
Thread is running, 1

Как вы можете видеть, потоки, созданные путем реализации интерфейса Runnable , воздействуют на один и тот же объект, в то время как потоки, созданные путем расширения класса Thread , воздействуют на разные объекты.

Вы также можете найти это в моем блоге: Ошан Упрети/| .

Оригинал: “https://dev.to/oshanoshu/runnable-vs-threads-5bef”