繁体   English   中英

实现多线程以使两个类同时运行

[英]Implementing multi-threading to make two classes run simultaneously

我将首先说我已经研究了多线程是如何工作的,因为我认为它将帮助我解决我遇到的问题,但是我并不真正理解它的实现是如何工作的。 现在,我已经设置了我的程序,这样当你按下按钮时它会触发MyTask。 MyTask在按钮下方运行一个计数器,最多10个,当它到达那里时停止,一旦它到达那里,MyTask1得到执行,启动计数器从按钮上方的10到0倒数。 我遇到的问题是,在Java中,事情是相继运行的,但我想要做的是让MyTask和MyTask1同时运行,这样两个计数器就会立刻发生。 我认为多线程可以帮助我,但我真的不明白如何使用它。 任何帮助,将不胜感激。 谢谢大家。

码:

package com.example.week11;

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import org.w3c.dom.Text;

public class MainActivity extends AppCompatActivity {

    Button btn;
    TextView txt;
    Integer count =1;
    Integer count1 =10;
    TextView txt1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       //p
       //p
       btn = (Button) findViewById(R.id.button);
       btn.setText("Start");
       txt = (TextView) findViewById(R.id.textView);
       txt1 = (TextView) findViewById(R.id.textView2);
       View.OnClickListener listener = new View.OnClickListener(){
           public void onClick(View view){
               count =1;
               //p
               //p
               switch (view.getId()){
                   case R.id.button:
                       new MyTask().execute(10);
                       new MyTask1().execute(0);
                       break;
               }
           }
       };
       btn.setOnClickListener(listener);

    }


    class MyTask extends AsyncTask<Integer, Integer, String> {
        @Override
        protected String doInBackground(Integer... params) {
            for (; count <= params[0]; count++) {
                try {
                    Thread.sleep(1000);
                    publishProgress(count);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return "Task Completed.";
        }
        @Override
        protected void onPostExecute(String result) {
            txt.setText(result);
            btn.setText("Restart");
        }
        @Override
        protected void onPreExecute() {
            txt.setText("Task Starting...");
        }
        @Override
        protected void onProgressUpdate(Integer... values) {
            txt.setText("BackGround Task Running..."+ values[0]);
        }
    }

    class MyTask1 extends AsyncTask<Integer, Integer, String> {
        @Override
        protected String doInBackground(Integer... params) {
            for (; count1 >= params[0]; count1--) {
                try {
                    Thread.sleep(1000);
                    publishProgress(count1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return "Task Completed.";
        }
        @Override
        protected void onPostExecute(String result) {
            txt1.setText(result);
            btn.setText("Restart");
        }
        @Override
        protected void onPreExecute() {
            txt1.setText("Task Starting...");
        }
        @Override
        protected void onProgressUpdate(Integer... values) {
            txt1.setText("Countdown "+ values[0]);
        }
    }
}

android中的AsyncTask在单线程上运行,直到您明确指定它使用多个线程。

AsyncTask源代码中,您可以看到默认的ExecutorSERIAL_EXECUTOR 源代码: https//github.com/aosp-mirror/platform_frameworks_base/blob/master/core/java/android/os/AsyncTask.java

您可以指定<YourAsyncTask>.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)以使AsyncTask执行并行执行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM