Java 如何向处理程序发送中断以中断线程。sleep()?
我在服务中有一个处理程序,我会阻止这个线程,直到用户选择停止服务。为了减少CPU占用,我尝试使用Thread.sleep()并在间隔Java 如何向处理程序发送中断以中断线程。sleep()?,java,android,multithreading,thread-sleep,android-handler,Java,Android,Multithreading,Thread Sleep,Android Handler,我在服务中有一个处理程序,我会阻止这个线程,直到用户选择停止服务。为了减少CPU占用,我尝试使用Thread.sleep()并在间隔10分钟后重复检查阻塞条件。下面是我的handlemessage的实现: @Override public void handleMessage(Message msg) { Log.e("Service", "looper started"); GPSThread gp=new GPSThread(getApplicationContext());
10分钟后重复检查阻塞条件。下面是我的handlemessage
的实现:
@Override
public void handleMessage(Message msg) {
Log.e("Service", "looper started");
GPSThread gp=new GPSThread(getApplicationContext());
gp.start();
ModeController mc=new ModeController(getApplicationContext());
mc.start();
NetworkSniffer nh=new NetworkSniffer(getApplicationContext());
nh.start();
while(stopService) //stopService is a volatile boolean i use to block until user opts to stop the service
{
try {
Thread.sleep(10*60*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
mc.stopThread();
gp.stopThread();
nh.stopNetworkThread();
stopSelf(msg.arg1);
}
现在我的问题是,如果我将stopService的值更改为false(通过一个公共函数),那么退出while循环可能需要10分钟。如果它是一个线程,我会使用thread.interrupt()并退出while循环
所以我的问题是如何实现处理程序的类似功能,即如何在处理程序中为Thread.sleep()抛出InterruptedException
如果它是一个线程,我会使用thread.interrupt()并退出while循环
实际上,代码>>是多亏了@Stephen C终于让它工作了。发布我的代码,希望它能在将来帮助他人:
package com.example.userpc.roadtracker;
import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.os.Process;
import android.util.Log;
/**
* Created by USER PC on 5/21/2016.
*/
public class MainServiceThread extends Service {
private Looper mServiceLooper;
private ServiceHandler mServiceHandler;
private volatile static boolean stopService=true;
private static HandlerThread mThread;
public static void stopServiceThread()
{
stopService=false;
mThread.interrupt();
}
private final class ServiceHandler extends Handler {
public ServiceHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
Log.e("Service", "looper started");
GPSThread gp=new GPSThread(getApplicationContext());
gp.start();
ModeController mc=new ModeController(getApplicationContext());
mc.start();
NetworkSniffer nh=new NetworkSniffer(getApplicationContext());
nh.start();
while(stopService)
{
try {
Thread.sleep(10*60*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
mc.stopThread();
gp.stopThread();
nh.stopNetworkThread();
stopSelf(msg.arg1);
}
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
Log.e("Service", "in onCreate");
stopService=true;
HandlerThread thread = new HandlerThread("ServiceStartArguments",
Process.THREAD_PRIORITY_BACKGROUND);
mThread=thread;
thread.start();
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e("Service","Started");
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
mServiceHandler.sendMessage(msg);
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
mThread=null;
Log.e("Service","Destroyed");
}
}
非常感谢您的链接,先生,我正在浏览。但我一件事也没得到。你说如果我能想出这个线索,我可以在上面打个中断。先生,我怎样才能算出这条线?这可能很难。(在经典的Java世界中,您可能会使用ThreadGroup层次结构并按名称查找线程。但这不是一个好主意。)如果您不能使用serviceStop,那么最好的办法是将线程引用记录在某个变量中……谢谢您,先生,终于让它起作用了。我从HandlerThread对象获得了线程实例,我使用它HandlerThread Thread=new HandlerThread(“ServiceStartArguments”,Process.Thread\u PRIORITY\u BACKGROUND)代码>。最后,我在stopServiceMethod()
中对这个线程变量调用了一个中断。