Потоки в Java без наследования?

Можно ли использовать многопоточность (то есть запускать несколько потоков, выполняя ваш собственный код) в Java без расширения Thread или реализации Runnable во время компиляции?

Два способа, о которых я могу думать:

  • Используйте отражение, чтобы создать класс во время выполнения, который расширяет Thread или реализует Runnable (не уверен, если это возможно, нет опыта работы с отражением).
  • Используйте собственный API (pthreads или Windows API?), Чтобы запустить другую версию метода java, который вы ищете. Это определенно будет работать, но вам, возможно, придется изменить основной код, чтобы выполнить определенную функцию по вашему выбору. Или, может быть, JVM можно поручить запустить метод, отличный от main? В этом случае метод все еще должен быть статическим, поэтому для нестатических методов это может потребовать дополнительного стандартного кода. В любом случае, это не так просто, как расширение Thread.

Я спрашиваю это чисто из технического придирчивого любопытства. Согласно JLS, Глава 17, наследование является единственным ответом, поскольку единственный способ запустить поток - это использовать Thread, а единственный способ изменить поведение Thread - это расширение или предоставление исполняемого объекта. Или я упускаю какие-либо другие способы специализировать тему?

Соответствующий раздел из JLS:

Потоки представлены классом Thread. Единственный способ для пользователя создать поток - это создать объект этого класса; каждый поток связан с таким объектом. Поток запускается, когда метод start () вызывается для соответствующего объекта Thread.

Всего 1 ответ


Вы можете создать анонимный внутренний класс, реализующий интерфейс Runnable :

Thread t1 = new Thread(new Runnable() {
    @Override
    public void run() {
        // code
    }
});

Или используйте лямбда-выражения (Java 8 или выше):

Thread t2 = new Thread(() -> {
    // code
});

Ничто из этого не позволяет избежать реализации интерфейса Runnable . Компилятор делает это для вас под капотом.


Есть идеи?

10000