多次启动/调用同一线程Java Android

Kas*_*sra 1 java multithreading android

我需要在我的应用中多次调用同一线程。使用我的原始代码,第一次执行就可以了。但是第二次崩溃-然后我得知每个线程只能执行不超过一次。

我的原始代码:

View.OnClickListener myClickListener = new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        mythread.start();
    }
};


Thread mythread = new Thread(){

    @Override
    public void run() {

        runOnUiThread(new Runnable() {
            public void run() {
                demoBt.setText("Running...");
            }
        });

     try {
        sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }       

        runOnUiThread(new Runnable() {
            public void run() {
                demoBt.setText("Finished...");
            }
        });
    }
};
Run Code Online (Sandbox Code Playgroud)

因此,正如我所说,如果我尝试第二次运行它,它将崩溃。所以我试着像这样修改它:

View.OnClickListener myClickListener = new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        test();
    }
};

private void test(){

    Thread mythread = new Thread(){

        @Override
        public void run() {

            runOnUiThread(new Runnable() {
                public void run() {
                    demoBt.setText("Running...");
                }
            });

         try {
            sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }       

            runOnUiThread(new Runnable() {
                public void run() {
                    demoBt.setText("Finished...");
                }
            });
        }
    };

    mythread.start();
}
Run Code Online (Sandbox Code Playgroud)

效果很好;但我的问题是,这是执行此操作的正确方法,还是有更优化的方法?

另外,从另一个线程的内部人员调用线程是否可以接受?(就像我在我的新线程中将内容放到UI线程上的方式一样)

编辑:这只是一个例子。对于我的实际代码,我需要进行大量基于数学的模拟,这需要10秒的时间。根据将显示给用户的结果,他们可能希望更改其输入参数,然后再次运行仿真。这将发生几次。

Mik*_*and 5

除了关于使用AsyncTask或runOnUiThread()的其他好答案之外,您还可以将私有成员定义为Runnable,如下所示:

private Runnable mytask = new Runnable() {
    @Override
    public void run() {

        runOnUiThread(new Runnable() {
            public void run() {
                demoBt.setText("Running...");
            }
        });

     try {
        sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }       

        runOnUiThread(new Runnable() {
            public void run() {
                demoBt.setText("Finished...");
            }
        });
    }
};
Run Code Online (Sandbox Code Playgroud)

然后,无论何时要运行它,都要做

new Thread(mytask).start();
Run Code Online (Sandbox Code Playgroud)