Java 启动并中断,然后再次启动线程

Java 启动并中断,然后再次启动线程,java,android,multithreading,thread-safety,android-threading,Java,Android,Multithreading,Thread Safety,Android Threading,我在android中创建活动时启动了一个线程 当单击“停止”时,它将中断线程以查看特定时间的数据,然后单击“开始”按钮启动线程 它将再次启动线程 有时它工作正常, 有时我会被错误打断 strt.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Drawer.start(); }); stp.setOn

我在android中创建活动时启动了一个线程

当单击“停止”时,它将中断线程以查看特定时间的数据,然后单击“开始”按钮启动线程 它将再次启动线程

有时它工作正常, 有时我会被错误打断

strt.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
             Drawer.start();
   });
    stp.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
        Drawer.interrupt();  });

怎么办?

假设
Drawer
是一个线程,您不能启动它两次:。您关于如何编写此代码的基本假设是有缺陷的

我建议不要直接使用线程。相反使用执行器服务,例如:

ExecutorService executor = Executors.newFixedThreadPool(1);
然后,在“开始”按钮的onClickListener中将工作提交到此池:

future = executor.submit(runnable);
其中
runnable
是您想要做的工作

返回的
Future
是一种传递运行
runnable
结果的东西,但也允许您执行取消操作(即要求它停止运行):

其中
true
表示要中断运行它的底层线程

因此,按下开始按钮时,将
future
存储在成员变量中,然后按下停止按钮时,如上所述取消它


注意,您需要使您的可运行句柄中断:这不是“免费”发生的事情。中断是一种协作机制:代码可以自由响应(或不响应)中断。

假设
Drawer
是一个线程,您不能启动它两次:@AndyTurner我在中断线程后启动它..这样做好吗?
future.cancel(true);