有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java重新启动线程(当它被加热时)

我正在开发一款安卓应用程序,它应该每3秒钟向服务器发送一次数据,并帮助用户启动或停止这个过程, 所以我创建了一个这样的线程:

class updaterunner implements Runnable {
        // @Override
        public void run() {
            while (threadex) {
                try {
                    doWork();
                    Thread.sleep(30000);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                } catch (Exception e) {
                }
            }
        }

        public void doWork() {

            runOnUiThread(new Runnable() {

                public void run() {
                    new startasynch().execute();

                }
            });
        }
    }

thradex初始化为false

“开始”按钮正在调用此函数:

threadex = true;

if (myThread.getState() == Thread.State.NEW)
{
    myThread.start();
}

“停止”按钮会调用以下命令:

threadex = false;

第一次启动工作正常,停止工作正常,但当我尝试重新启动它时,它不工作,当我检查线程状态时,我发现它已终止。。能给我解释一下吗


共 (2) 个答案

  1. # 1 楼答案

    我认为一个更简单的解决方案是使用AndroidsAsyncTask。它将异步完成您的工作,并为您提供所需的所有回调,以保持您的UI线程自由。它看起来像这样:

    package com.example.asynctasktest;
    
    import android.app.Activity;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    
    
    public class MainActivity extends Activity {
    
        private MyAsyncTask backgroundTask;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            int id = item.getItemId();
            if (id == R.id.action_settings) {
                return true;
            }
            return super.onOptionsItemSelected(item);
        }
    
        public void onButtonPressStopThread(View v){
            backgroundTask.cancel(false);
        }
    
        public void onButtonPressStartThread(View v){
            startThread();
        }
    
        public void startThread(){
            backgroundTask = new MyAsyncTask();
            backgroundTask.execute();
        }
    
        public class MyAsyncTask extends AsyncTask<Void, Void, Void>{
    
            @Override
            protected Void doInBackground(Void... params) {
                try {
                    Thread.sleep(30000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    
                //Send data to server
    
                return null;
            }
    
            @Override
            protected void onPostExecute(Void result) {
                super.onPostExecute(result);
                startThread();
            }
        }
    }
    

    编辑:添加了用于启动和停止线程执行的按钮单击

  2. # 2 楼答案

    (大T)线程对象管理(小T)线程的生命周期。(小t)线不是可以“重新开始”的东西。这些词没有任何意义:当你调用myThread时,一个小t线程就出现了。start(),当其run()方法返回时,它就不再存在。你不能重新开始不存在的事情

    Java库开发人员设计了big-T Thread类,以反映对线程的这种思考方式。如果你想创建一个新的little-t线程(即使它会像旧线程那样),你必须创建一个新的big-t线程来管理它