code: public static Collection<Thread> findThreadsByName(final String threadName, final String threadGroupName) {
          Validate.isTrue(threadName != null, "The thread name must not be null");
          Validate.isTrue(threadGroupName != null, "The thread group name must not be null");
  
          final Collection<ThreadGroup> threadGroups = findThreadGroups(new NamePredicate(threadGroupName));
  
          if(threadGroups.isEmpty()) {
              return Collections.emptyList();
          }
  
          final Collection<Thread> result = new ArrayList<>();
          final NamePredicate threadNamePredicate = new NamePredicate(threadName);
          for(final ThreadGroup group : threadGroups) {
              result.addAll(findThreads(group, false, threadNamePredicate));
          }
          return Collections.unmodifiableCollection(result);
      }
docs: Return active threads with the specified name if they belong to a thread group with the specified group name.
  
  @param threadName The thread name
  @param threadGroupName The thread group name
  @return The threads which belongs to a thread group with the specified group name and the thread's name match the specified name,
  An empty collection is returned if no such thread exists. The collection returned is always unmodifiable.
  @throws IllegalArgumentException if the specified thread name or group name is null
  @throws  SecurityException
  if the current thread cannot access the system thread group
  
  @throws  SecurityException  if the current thread cannot modify
  thread groups from this thread's thread group up to the system thread group