当我重新打开应用程序时,如何检查来自先前会话的线程是否仍在运行?

时间:2011-12-16 16:07:20

标签: java android multithreading

我的应用程序正在启动一个持续运行的线程,该线程运行一段时间(true){}。当我重新打开/重新进入应用程序时,会创建另一个线程并与之前的线程同时工作。我想要一种机制,可以检查来自前一个会话的线程是否仍在运行,如果是,那么它不应该重新创建它。如何实现?

4 个答案:

答案 0 :(得分:1)

一种方法:创建一个带有简单布尔值的首选项文件,以表示是否运行 http://developer.android.com/guide/topics/data/data-storage.html#pref

答案 1 :(得分:1)

在你的主题中创建一个

Boolean isRunning = false;

当你的线程开始时 把它放在这样的应用程序共享首选项中..

  isRunning = true;
  SharedPreferences settings = getSharedPreferences("isThreadRunning", 0);
  SharedPreferences.Editor editor = settings.edit();
  editor.putBoolean("isRunning", isRunning);
  editor.commit();

现在线程完成后,只需将其更改为false。

isRunning = false;

在你的活动中,只需将布尔值从共享偏好中拉出来。

   SharedPreferences settings = getSharedPreferences("isThreadRunning", 0);
   boolean running = settings.getBoolean("silentMode", false); //if it doesnt exist it will automatically set to false which means the thread hasnt or isnt running

 then just test.

 if(running){
 //Do something
 }else{
 //the thread isnt running so lets start it.
 }

这是一种非常简单的方法。

希望有所帮助

答案 2 :(得分:1)

我写了一个简单的线程列出了一段时间。 user1031312有一个更好的解决方案,但无论如何它都是对你有用的。不确定它是否会列出前一个会话中的线程。它将在名为thread_textview的TextView中列出线程名称和id。

// This method recursively visits all thread groups under 'group'.
public static void visit(ThreadGroup group, int level) {
    // Get threads in 'group'
    int numThreads = group.activeCount();
    Thread[] threads = new Thread[numThreads*2];
    numThreads = group.enumerate(threads, false);

    // Enumerate each thread in 'group'
    for (int i=0; i<numThreads; i++) {
        // Get thread
        thread_textview.append("-> "+threads[i].getName()+":"+threads[i].getId()+"\n");
    }

    // Get thread subgroups of 'group'
    int numGroups = group.activeGroupCount();
    ThreadGroup[] groups = new ThreadGroup[numGroups*2];
    numGroups = group.enumerate(groups, false);

    // Recursively visit each subgroup
    for (int i=0; i<numGroups; i++) {
        visit(groups[i], level+1);
    }
}

答案 3 :(得分:1)

您可以使用ServerSocket绑定到端口。 OS一次只允许绑定一个线程。这将阻止下一个不执行。

ServerSocket serverSocket = new ServerSocket(1234);

对于下一个线程,它将抛出BindException。所以你的线程第一行就可以做你想要的了。

P.S。 1234是未使用的端口号。

另一种选择 - 上面的答案可能不适合你想要的,所以这里是另一种选择。

public MyThreadFactory {

     List<String> runningThreads = new List<String>();

     public synchronized void startThread(MyThread thread) {
          if (! runningThreads.contains(thread.getID())) {
                runningThreads.add(thread.getID());
                // MyThread implements Runnable
                new Thread(thread).start();
          }
     }
}

假设您的线程对象具有getID方法或唯一标识其类型的内容。