Потоки в Java могут быть созданы двумя способами:
- Расширение класса потоков
- Реализация Управляемого Интерфейса
Расширение класса потоков:
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”