На самом деле, не стоит сравнивать Runnable
и Thread
друг с другом.
Эти два имеют зависимость и отношение в многопоточности, подобно Wheel and Engine
отношениям в автомобиле.
Я бы сказал, что есть только один способ многопоточности с двумя шагами. Позвольте мне высказать свое мнение.
Runnable:
При реализации interface Runnable
это означает, что вы создаете что-то, что является run able
в другом потоке. Теперь создание чего-либо, что может выполняться внутри потока (может выполняться внутри потока), не означает создание потока.
Таким образом, класс MyRunnable
является не чем иным, как обычным классом с методом void run
. И это объекты будут обычными объектами только с методом run
, который будет нормально выполняться при вызове. (если мы не передадим объект в потоке).
Thread:
class Thread
, я бы сказал, особый класс с возможностью запуска нового Thread, который фактически позволяет многопоточность через его метод start()
.
Почему бы не разумно сравнивать?
Потому что они нужны нам для многопоточности.
Для многопоточности нам нужны две вещи:
Таким образом, технически и теоретически они оба необходимы для запуска потока, один будет выполнять , а другой заставит его запустить (Как Wheel and Engine
автомобиля).
Вот почему вы не можете запустить поток с MyRunnable
, вам нужно передать его экземпляру Thread
.
Но можно создавать и запускать поток только с использованием class Thread
, потому что Class Thread
реализует Runnable
, поэтому мы все знаем, что Thread
также является Runnable
внутри.
Наконец, Thread
и Runnable
дополняют друг друга для многопоточности не конкурента или замены.
Изменить:
Если посмотреть на ваше сообщение об ошибке:
Fatal error in MPI_Cart_coords: Invalid communicator, error stack:
MPI_Cart_coords(130): MPI_Cart_coords(MPI_COMM_NULL, rank=3, maxdims=2, coords=0x6a9010) failed
MPI_Cart_coords(74).: Null communicator
похоже, что коммуникатор для MPI_Cart_coords
пуст. При обратном сканировании это инициализируется вызовом MPI_Cart_create
~ 5 строк выше.
На странице руководства MPI_Cart_create
(выделено мной):
ОПИСАНИЕ
MPI_Cart_create возвращает дескриптор нового коммуникатора, к которому Информация о декартовой топологии прилагается. Если reorder = false, тогда ранг каждого процесса в новой группе идентичен его рангу в старой группе. В противном случае функция может изменить порядок процессов. (возможно, чтобы выбрать хорошее вложение виртуальной топологии на физическую машину). Если общий размер декартовой сетки меньше, чем размер группы комм, то некоторые процессы возвращаются MPI_COMM_NULL, по аналогии с MPI_Comm_split. Звонок ошибочен, если он определяет сетку, которая больше, чем группа размер.
Похоже, это ваша проблема.