Вы не можете оптимизировать его, изменив его на while.
Вы можете просто увеличить скорость очень, очень, очень мало, изменив линию
for (int k = 0; k < length - 1; k++) {
на
for (int k = 0; k < lengthMinusOne; k++) {
, где lengthMinusOne вычисляется до
, это вычитание равно просто вычисляю почти (200x201 / 2) x (200-1) раз, а для компьютера это очень мало:)
Как уже упоминалось, оболочка вокруг класса Thread может уловить это состояние. Вот пример.
>>> from threading import Thread
>>> class MyThread(Thread):
def run(self):
try:
Thread.run(self)
except Exception as err:
self.err = err
pass # or raise err
else:
self.err = None
>>> mt = MyThread(target=divmod, args=(3, 2))
>>> mt.start()
>>> mt.join()
>>> mt.err
>>> mt = MyThread(target=divmod, args=(3, 0))
>>> mt.start()
>>> mt.join()
>>> mt.err
ZeroDivisionError('integer division or modulo by zero',)
Вы можете установить для какой-либо глобальной переменной значение 0 в случае успеха или ненулевое значение в случае исключения. Это довольно стандартное соглашение.
Однако вам необходимо защитить эту переменную мьютексом или семафором. Или вы можете убедиться, что только один поток когда-либо будет писать в него, а все остальные просто прочитают его.
Пусть ваша функция потока перехватит исключения. (Вы можете сделать это с помощью простой функции-оболочки, которая просто вызывает старую функцию потока внутри try
... за исключением
или try
... кроме блока
... else
). Тогда вопрос просто сводится к «как передавать информацию из одного потока в другой», и я думаю, вы уже знаете, как это сделать.