我想知道某个线程的实例是否正在运行,所以我可以使用它。这是可能的,我该怎么做?任何策略或建议?
例如说我有这个帖子:
public class SomeThread extends Thread{
ArrayList<String> stringArray=new ArrayList<String>();
public void run(){
//some long time operation or messaging going on
}
public ArrayList<String> getList(){
return stringArray;
}
}
public abstract class AnyActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(//any an instace of SomeThread exist){
ArrayList<String> array=//somehow.getList();
} else {
SomeThread thread=new SomeThread();
thread.setPriority(Thread.MAX_PRIORITY);
thread.start();
}
}
编辑1:我不想传递线程的引用,因为这可能是我启动它的唯一地方。想想SomeThread具有重要意义并从应用程序开始。我需要通过Messenger
来询问它,或者它可以告诉活动以相同的方式做某事。我已经更新了示例代码并设置了AnyActivity摘要。应用程序中的所有活动扩展这个课程,所以我不知道线程是否已经创建并启动,这意味着我不能依赖引用。
所以我无法使用thread.isAlive()
并且没有静态方法SomeThread.isAlive()
。我想在线程中使用setName()
,但我怎么能在其后找到它的名字?
答案 0 :(得分:1)
找到解决方案,感谢指导
private SomeThread getSomeThread(){
Thread thread=null;
int i=0;
Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
Thread[] threadArray = threadSet.toArray(new Thread[threadSet.size()]);
while(thread==null && i<threadArray.length){
if(threadArray[i].getName().equals(SomeThread.class.getSimpleName()))
thread=threadArray[i];
i++;
}
return (SomeThread)thread;
}
答案 1 :(得分:0)
您需要将您感兴趣的线程的引用稍后/进一步传递给您的代码,然后使用以下代码进行测试:
Thread t; t.isAlive();
P.S。您可以准确地告诉我们您想要做什么,也许我们可以为您提供更多帮助。
答案 2 :(得分:0)
thread.isAlive()
是你的朋友:http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html#isAlive()
答案 3 :(得分:0)
答案 4 :(得分:0)
if( SomeThread.isAlive())
{
// in running state
}
如果isAlive()方法正在运行,则返回true