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