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

时间:2019-05-14 06:28:21

标签: java android multithreading thread-safety android-threading

在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();  });

该怎么办?

1 个答案:

答案 0 :(得分:0)

假设Drawer是一个线程,则不能两次启动它:"It is never legal to start a thread more than once"。关于如何编写此代码的基本假设是有缺陷的。

我建议不要直接使用线程。代替。使用ExecutorService,例如:

ExecutorService executor = Executors.newFixedThreadPool(1);

然后,通过开始按钮的onClickListener将工作提交到该池:

future = executor.submit(runnable);

其中runnable是您要完成的工作。

返回的Future可以传达运行runnable的结果,但还可以让您执行取消操作(即要求其停止运行):

future.cancel(true);

其中true表示您想中断正在运行它的基础线程。

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

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