Поскольку примитивные типы являются автобоксами, вызов getConstructor(java.lang.Class<?>... parameterTypes)
завершится с ошибкой. Вам нужно будет вручную прокрутить доступные конструкторы. Если все типы совпадают, вы в порядке. Если некоторые типы не совпадают, но требуемый тип является примитивным И доступным типом является соответствующий класс-оболочка, тогда вы можете использовать этот конструктор. См. Ниже:
static <C> Constructor<C> getAppropriateConstructor(Class<C> c, Object[] initArgs){
if(initArgs == null)
initArgs = new Object[0];
for(Constructor con : c.getDeclaredConstructors()){
Class[] types = con.getParameterTypes();
if(types.length!=initArgs.length)
continue;
boolean match = true;
for(int i = 0; i < types.length; i++){
Class need = types[i], got = initArgs[i].getClass();
if(!need.isAssignableFrom(got)){
if(need.isPrimitive()){
match = (int.class.equals(need) && Integer.class.equals(got))
|| (long.class.equals(need) && Long.class.equals(got))
|| (char.class.equals(need) && Character.class.equals(got))
|| (short.class.equals(need) && Short.class.equals(got))
|| (boolean.class.equals(need) && Boolean.class.equals(got))
|| (byte.class.equals(need) && Byte.class.equals(got));
}else{
match = false;
}
}
if(!match)
break;
}
if(match)
return con;
}
throw new IllegalArgumentException("Cannot find an appropriate constructor for class " + c + " and arguments " + Arrays.toString(initArgs));
}
Вам не нужно использовать подкласс Thread
, чтобы эта работа работала - взгляните на простой пример, который я публикую ниже, чтобы узнать, как:
from threading import Thread
from time import sleep
def threaded_function(arg):
for i in range(arg):
print("running")
sleep(1)
if __name__ == "__main__":
thread = Thread(target = threaded_function, args = (10, ))
thread.start()
thread.join()
print("thread finished...exiting")
Здесь я показываю, как использовать модуль потоковой передачи для создания потока, который вызывает обычную функцию в качестве своей цели. Вы можете увидеть, как я могу передать ему все необходимые аргументы в конструкторе потока.
Есть несколько проблем с вашим кодом:
def MyThread ( threading.thread ):
Если вы действительно хотите сделать это только с функциями, у вас есть два варианта:
С threading:
import threading
def MyThread1():
pass
def MyThread2():
pass
t1 = threading.Thread(target=MyThread1, args=[])
t2 = threading.Thread(target=MyThread2, args=[])
t1.start()
t2.start()
С потоком:
import thread
def MyThread1():
pass
def MyThread2():
pass
thread.start_new_thread(MyThread1, ())
thread.start_new_thread(MyThread2, ())
Документ для thread.start_new_thread
Вы переопределили метод run ()? Если вы переопределили __ init __
, вы обязательно вызывали базовый threading.Thread .__ init __ ()
?
После запуска двух потоков продолжает ли работать основной поток неограниченно / блокировать / присоединяться к дочерним потокам, чтобы выполнение основного потока не заканчивалось до того, как дочерние потоки завершили свои задачи?
И, наконец, получаете ли вы какие-либо необработанные исключения?
Вы можете использовать аргумент target
в конструкторе Thread
, чтобы напрямую передать вызываемую функцию вместо run
.