Переопределяем ли мы метод run, когда дочерний класс расширяется из родительского класса потока - PullRequest
4 голосов
/ 12 ноября 2010

Когда мы создаем поток Subclass, переопределяем ли он метод run? Мы знаем, что сам класс Thread реализует Runnable, но в классе Runnable не определено тело для метода run.

Это картинка в моих мыслях:

Runnable - Родительский класс - в нем есть метод run с пустым телом.

Нить - Ребенок,

classA расширяет Thread- Child of Child,

когда мы определяем метод run () в "classA", переопределяем ли мы метод run, объявленный в классе Runnable? Спасибо за ваше время.

Ответы [ 2 ]

9 голосов
/ 12 ноября 2010

Существует два способа определить поведение потока: создать подкласс класса Thread или реализовать интерфейс Runnable.

Для первого способа просто расширьте класс Thread и переопределите метод run () в собственной реализации:

public class HelloThread extends Thread {
    @Override
    public void run() {
        System.out.println("Hello from a thread!");
    }
}

public class Main { 
    // main method just starts the thread 
    public static void main(String args[]) {
        (new HelloThread()).start();
    }
}

Однако предпочтительным способом реализации логики для потока является создание класса, реализующего интерфейс Runnable:

public class HelloRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("Hello from a thread!");
    }
}

public class Main {
    // notice that we create a new Thread and pass it our custom Runnable
    public static void main(String args[]) {
        (new Thread(new HelloRunnable())).start();
    }
}

Причина, по которой реализация Runnable является предпочтительной, заключается в том, что она обеспечивает четкое разделение между поведением потока и самого потока. Например, при использовании пула потоков вы фактически никогда не создаете поток с нуля, вы просто передаете Runnable в платформу и он выполнит его в доступном для вас потоке:

public class Main {
    public static void main(String args[]) {
        int poolSize = 5;
        ExecutorService pool = Executors.newFixedThreadPool(poolSize);
        pool.execute(new HelloRunnable());
    }
 }

Дополнительная литература:

0 голосов
/ 12 ноября 2010

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

Интерфейс сообщает вам, что, если вы используете этот интерфейс, вы получите функциональность. В вашем случае, ваша логика бизнеса должна быть запущена в потоке, тогда используйте интерфейс.

Если вы лучше работаете с потоком, то расширьте поток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...