я видел такой комментарий
в одном месте, где я видел эту проблему, если вы продолжаете создавать потоки, и вместо вызова start (), вызывайте run () непосредственно для объекта потока , Это приведет к тому, что объект потока не будет разыменован ... Поэтому через некоторое время сообщение о невозможности создания нового собственного потока появляется
. В моем приложении изначально мы планируем использовать поток, но позже мы решили, что больше нет необходимости, поэтому мы просто вызовите run () вместо start (). Нужно ли выполнять ручной сборщик мусора для нового threadClass (..)?
мой параметр запуска tomcat
-Xms1024m -Xmx1024m -XX:MaxPermSize=450m
Почему вы в первую очередь создаете Thread
?
Вместо этого ваш код должен реализовывать интерфейс Runnable
.
Затем, когда вы решите, что хотите запустить его в потоке, просто создайте экземпляр Thread
с Runnable
в качестве аргумента и вызовите start ()
в объекте Thread
.
Если вместо этого вы просто хотите запустить его в текущем потоке, просто вызовите run ()
для своего объекта Runnable
.
У этого есть несколько преимуществ:
Thread
, пока вам не нужны отдельные потоки Runnable
, который концептуально подходит ближе: вы же не пишете какой-то особый поток, не так ли? Вы просто пишете код, который можно выполнить / запустить. Executor
, которое еще больше абстрагируется от решения И, наконец, что не менее важно, вы избегаете любой потенциальной путаницы относительно того, создан ли собственный ресурс потока или нет.
При вызове метода run () новый поток не должен создаваться. И ваши объекты будут собираться сборщиком мусора, когда на них нет ссылок.
Другая часть вашего кода может создавать множество потоков.
Попробуйте использовать ThreadPoolExecutor (пул потоков) в своем коде, чтобы ограничить количество потоков в приложении, и соответствующим образом настройте размер пула потоков для повышения производительности.
Вы также можете проверить следующее, чтобы отладить свою проблему: (ссылка на ссылку) Если вы столкнулись с этим исключением, нужно сделать несколько действий.