Thread threads = new Thread(func);
Вы передаете не имя функции, а метод. При этом метод должен соответствовать определенному описанию
delegate void ParameterizedThreadStart(object obj); // если передается параметр
delegate void ThreadStart(); // если не передается
Программа это всетаки набор функций/[методов обьектов]. И имен у этих функций как таковых нет.
Имена функций это extra информация, что в .Net можно получить через механизм Reflection.
Для вашей задачи, можно сделать коллекцию.
Dictionary<string, Action> funcs;
Куда сможете сохранить нужные вам имена и задать функцию для исполнения.
Thread threads = new Thread(funcs["имя функции"]);
Для более сложных вариантов, вам нужно будет смотреть в сторону использования Reflection