Ensure GetThreadState works with Thread subtypes

We were incorrectly assuming that Thread has no subclasses. This is
not accurate.

Bug: 66704836
Test: ./test.py --host -j50
Change-Id: I4abd85b6c4e6add6d62854adb4f8912777292315
diff --git a/openjdkjvmti/ti_thread.cc b/openjdkjvmti/ti_thread.cc
index d437e52..da1c1bc 100644
--- a/openjdkjvmti/ti_thread.cc
+++ b/openjdkjvmti/ti_thread.cc
@@ -484,13 +484,18 @@
   }
 
   art::ScopedObjectAccess soa(self);
+  art::StackHandleScope<1> hs(self);
 
   // Need to read the Java "started" field to know whether this is starting or terminated.
-  art::ObjPtr<art::mirror::Object> peer = soa.Decode<art::mirror::Object>(thread);
-  art::ObjPtr<art::mirror::Class> klass = peer->GetClass();
-  art::ArtField* started_field = klass->FindDeclaredInstanceField("started", "Z");
+  art::Handle<art::mirror::Object> peer(hs.NewHandle(soa.Decode<art::mirror::Object>(thread)));
+  art::ObjPtr<art::mirror::Class> thread_klass =
+      soa.Decode<art::mirror::Class>(art::WellKnownClasses::java_lang_Thread);
+  if (!thread_klass->IsAssignableFrom(peer->GetClass())) {
+    return ERR(INVALID_THREAD);
+  }
+  art::ArtField* started_field = thread_klass->FindDeclaredInstanceField("started", "Z");
   CHECK(started_field != nullptr);
-  bool started = started_field->GetBoolean(peer) != 0;
+  bool started = started_field->GetBoolean(peer.Get()) != 0;
   constexpr jint kStartedState = JVMTI_JAVA_LANG_THREAD_STATE_NEW;
   constexpr jint kTerminatedState = JVMTI_THREAD_STATE_TERMINATED |
                                     JVMTI_JAVA_LANG_THREAD_STATE_TERMINATED;