Потоки в 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”