查找线程的实例

时间:2013-04-27 13:14:39

标签: java android multithreading

我想知道某个线程的实例是否正在运行,所以我可以使用它。这是可能的,我该怎么做?任何策略或建议?

例如说我有这个帖子:

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(),但我怎么能在其后找到它的名字?

5 个答案:

答案 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)

答案 3 :(得分:0)

答案 4 :(得分:0)

 if( SomeThread.isAlive())
 {
       // in running state 
 }
如果

isAlive()方法正在运行,则返回true