Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在重新打开应用程序时检查上一个会话中的线程是否仍在运行?_Java_Android_Multithreading - Fatal编程技术网

Java 如何在重新打开应用程序时检查上一个会话中的线程是否仍在运行?

Java 如何在重新打开应用程序时检查上一个会话中的线程是否仍在运行?,java,android,multithreading,Java,Android,Multithreading,我的应用程序正在启动一个持续运行的线程,该线程运行一段时间(true){}。当我重新打开/重新输入应用程序时,会创建另一个线程,并与前一个线程并行工作。我想要一种机制,它可以检查前一个会话中的线程是否仍在运行,如果仍在运行,则不应重新创建它。如何实现这一点?一种方法:创建一个带有简单布尔值的首选项文件,表示是否正在运行。 一种方法:创建一个带有简单布尔值的首选项文件,表示是否正在运行。 在线程中创建一个 Boolean isRunning = false; 当线程启动时 将其放入应用程序共享首

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

一种方法:创建一个带有简单布尔值的首选项文件,表示是否正在运行。

一种方法:创建一个带有简单布尔值的首选项文件,表示是否正在运行。

在线程中创建一个

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.
 }
这是一个非常简单的方法


希望它能帮助你的线程创建一个

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.
 }
这是一个非常简单的方法


希望能有所帮助

我不久前写了一个简单的线程列表。user1031312有一个更好的解决方案,但无论如何,在这里它对您有用。但不确定它是否会列出上一个会话中的线程。它将在名为thread_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);
    }
}
//此方法递归访问“group”下的所有线程组。
公共静态无效访问(线程组组,int级别){
//获取“组”中的线程
int numThreads=group.activeCount();
线程[]线程=新线程[numThreads*2];
numThreads=group.enumerate(线程,false);
//枚举“组”中的每个线程

对于(int i=0;i我在不久前写了一个简单的线程列表。user1031312有一个更好的解决方案,但在这里它无论如何对您有用。但不确定它是否会列出前一个会话中的线程。它会在名为thread\u 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);
    }
}
//此方法递归访问“group”下的所有线程组。
公共静态无效访问(线程组组,int级别){
//获取“组”中的线程
int numThreads=group.activeCount();
线程[]线程=新线程[numThreads*2];
numThreads=group.enumerate(线程,false);
//枚举“组”中的每个线程

对于(int i=0;i您可以使用ServerSocket绑定到端口。操作系统一次只允许绑定一个线程。这将防止下一个线程不执行

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();
          }
     }
}
public-readfactory{
List runningThreads=new List();
公共同步的void startThread(MyThread线程){
如果(!runningThreads.contains(thread.getID())){
runningThreads.add(thread.getID());
//MyThread实现可运行
新线程(Thread.start();
}
}
}

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

您可以使用ServerSocket绑定到端口。操作系统一次只允许绑定一个线程。这将防止下一个线程不执行

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();
          }
     }
}
public-readfactory{
List runningThreads=new List();
公共同步的void startThread(MyThread线程){
如果(!runningThreads.contains(thread.getID())){
runningThreads.add(thread.getID());
//MyThread实现可运行
新线程(Thread.start();
}
}
}

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

谢谢,我正在考虑它,但希望看到其他人的建议:)谢谢,我正在考虑它,但希望看到其他人的建议:)在线程完成并设置为false后,请确保将其放入捆绑包中,就像我在第一行代码中所做的那样。谢谢,这似乎是一个非常好且简单的解决方案,SharedReferences是否在关闭时保持?因为如果是这样,则我的isRunning将始终设置为true,即使线程被关闭。Yes SharedReference是持久性的!这就是它最棒的地方。它实际上会写入xml文件。在线程完成并设置为false后,请确保像我在第一行代码中所做的那样将其放入捆绑包中。感谢这似乎是一个非常好且简单的解决方案,SharedReference在关闭时会持久化吗?因为如果它这样做en my isRunning将始终设置为true,即使线程被关闭而终止。是的,SharedReference是持久的!这就是它的了不起之处。它实际上会写入xml文件。@JohnVint是的,它们应该这样做。因为应用程序正在安卓设备上运行。请忽略手机关闭时的情况,因为这些线程会被删除e无论如何都会被终止。@JohnVint是的,它们应该被终止。因为应用程序正在android设备上运行。当手机关闭时忽略这个案例,因为这些线程无论如何都会被终止。虽然你是对的,但我正在寻找一个更一般的答案,你看我有4个while(true)线程,其中只有两个是服务器,谢谢:)@Mike我想我误解了。你所有的线程都在同一个进程中吗?对不起,我什么都没提