How to count threads created by android program

2019-09-16 22:30发布

I want to know

  1. How to know no. of threads created by my program so that I can manage them well and stop as required. Other than the name of threads, is there any way to identify threads created by business logic in program in Android Debug Monitor? Sample ADM output as below: screenshot of Threads by name in Android Debug Monitor

  2. Threads dont stop if the service that created thread is destroyed or even the app is killed explicitly. Threads are stopped only when they are done with the task i.e. when they exit run() if not interrupted explicitly.

Have created a sample program to understand, as below:

//DemoService.java class
Intent mIntent;

String TAG="Logs";

Thread myThread;

static int k = 0;

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.d(TAG,"--------------service started'");
    mIntent = intent;
    final int currentId = startId;

    k++;
    Runnable myRunnable = new Runnable() {
        @Override
        public void run() {

            for (int i = 0; i < 5; i++)
            {
                long endTime = System.currentTimeMillis() + 5*1000;

                while (System.currentTimeMillis() < endTime) {
                    synchronized (this) {
                        try {
                            wait(endTime -
                                    System.currentTimeMillis());

                            int[] numbers = mIntent.getIntArrayExtra("numbers");
                            int result = numbers[0] + numbers[1];

                            Log.d(TAG,"result : " + result);

                        } catch (Exception e) {
                        }
                    }
                }
                Log.i(TAG, "Service running " + currentId);
            }

        }
    };

    myThread = new Thread(myRunnable);
    myThread.start();
    myThread.setName("Test Thread  " + k);

    Log.d(TAG, "Thread Id : " + myThread.getId() + ", " + "Name : " + "Test Thread  " + k);

    checkThreads();
    return Service.START_STICKY;
}

private void checkThreads(){
    Log.d(TAG,"myThread.getName(): " + myThread.getName() + ", " + "myThread.isAlive(): " + myThread.isAlive());

}

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}

}

public class MainActivity extends AppCompatActivity {

EditText num1,num2;

private String TAG = "Logs";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    num1 = (EditText) findViewById(R.id.num1);
    num2 = (EditText) findViewById(R.id.num2);

}

public void onClickAdd(View view){
    if(view.getId() == R.id.add_btn){
        Intent serviceIntent = new Intent();
        serviceIntent.setClass(MainActivity.this, DemoService.class);

        int[] numbers = new int[2];

        numbers[0]= Integer.parseInt(num1.getText().toString());
        numbers[1]=Integer.parseInt(num2.getText().toString());
        serviceIntent.putExtra("numbers",numbers);
        startService(serviceIntent);
    }

}

public void onClickServiceStop(View view){
    Intent serviceIntent = new Intent();
    serviceIntent.setClass(MainActivity.this, DemoService.class);

    Log.d(TAG,"stopping service");
    stopService(serviceIntent);
}

}

Output when service is stopped explicitly with a call to stopService()

05-15 19:05:56.020 30097-30097/? D/Logs: --------------service started'
05-15 19:05:56.022 30097-30097/? D/Logs: Thread Id : 878, Name : Test Thread  1
05-15 19:05:56.022 30097-30097/? D/Logs: myThread.getName(): Test Thread  1, myThread.isAlive(): true
05-15 19:06:01.023 30097-31250/? D/Logs: result : 77
05-15 19:06:01.023 30097-31250/? I/Logs: Service running 1
05-15 19:06:02.283 30097-30097/? D/Logs: --------------service started'
05-15 19:06:02.284 30097-30097/? D/Logs: Thread Id : 879, Name : Test Thread  2
05-15 19:06:02.284 30097-30097/? D/Logs: myThread.getName(): Test Thread  2, myThread.isAlive(): true
05-15 19:06:03.004 30097-30097/? D/Logs: --------------service started'
05-15 19:06:03.005 30097-30097/? D/Logs: Thread Id : 880, Name : Test Thread  3
05-15 19:06:03.005 30097-30097/? D/Logs: myThread.getName(): Test Thread  3, myThread.isAlive(): true
05-15 19:06:06.024 30097-31250/? D/Logs: result : 77
05-15 19:06:06.024 30097-31250/? I/Logs: Service running 1
05-15 19:06:07.286 30097-31258/? D/Logs: result : 77
05-15 19:06:07.286 30097-31258/? I/Logs: Service running 2
05-15 19:06:08.007 30097-31259/? D/Logs: result : 77
05-15 19:06:08.007 30097-31259/? I/Logs: Service running 3
05-15 19:06:11.024 30097-31250/? D/Logs: result : 77
05-15 19:06:11.024 30097-31250/? I/Logs: Service running 1
05-15 19:06:12.286 30097-31258/? D/Logs: result : 77
05-15 19:06:12.287 30097-31258/? I/Logs: Service running 2
05-15 19:06:13.007 30097-31259/? D/Logs: result : 77
05-15 19:06:13.007 30097-31259/? I/Logs: Service running 3
05-15 19:06:16.025 30097-31250/? D/Logs: result : 77
05-15 19:06:16.025 30097-31250/? I/Logs: Service running 1
05-15 19:06:17.288 30097-31258/? D/Logs: result : 77
05-15 19:06:17.288 30097-31258/? I/Logs: Service running 2
05-15 19:06:18.007 30097-31259/? D/Logs: result : 77
05-15 19:06:18.007 30097-31259/? I/Logs: Service running 3
05-15 19:06:21.025 30097-31250/? D/Logs: result : 77
05-15 19:06:21.025 30097-31250/? I/Logs: Service running 1
05-15 19:06:21.537 30097-30097/? D/Logs: stopping service    <----- Service stopped explcitly with stopService()
05-15 19:06:22.288 30097-31258/? D/Logs: result : 77
05-15 19:06:22.288 30097-31258/? I/Logs: Service running 2
05-15 19:06:23.008 30097-31259/? D/Logs: result : 77
05-15 19:06:23.008 30097-31259/? I/Logs: Service running 3
05-15 19:06:27.288 30097-31258/? D/Logs: result : 77
05-15 19:06:27.289 30097-31258/? I/Logs: Service running 2
05-15 19:06:28.008 30097-31259/? D/Logs: result : 77
05-15 19:06:28.008 30097-31259/? I/Logs: Service running 3


Output when app is killed explicitly, thread and service continues to run
05-15 19:08:35.093 30097-30097/? D/Logs: --------------service started'
05-15 19:08:35.094 30097-30097/? D/Logs: Thread Id : 882, Name : Test Thread  4
05-15 19:08:35.094 30097-30097/? D/Logs: myThread.getName(): Test Thread  4, myThread.isAlive(): true
05-15 19:08:38.382 30097-30097/? D/Logs: --------------service started'
05-15 19:08:38.382 30097-30097/? D/Logs: Thread Id : 883, Name : Test Thread  5
05-15 19:08:38.382 30097-30097/? D/Logs: myThread.getName(): Test Thread  5, myThread.isAlive(): true
05-15 19:08:38.828 30097-30097/? D/Logs: --------------service started'
05-15 19:08:38.829 30097-30097/? D/Logs: Thread Id : 884, Name : Test Thread  6
05-15 19:08:38.829 30097-30097/? D/Logs: myThread.getName(): Test Thread  6, myThread.isAlive(): true
05-15 19:08:40.096 30097-31891/? D/Logs: result : 77
05-15 19:08:40.096 30097-31891/? I/Logs: Service running 1
05-15 19:08:43.384 30097-31974/? D/Logs: result : 77
05-15 19:08:43.384 30097-31974/? I/Logs: Service running 2
05-15 19:08:43.830 30097-31981/? D/Logs: result : 77
05-15 19:08:43.830 30097-31981/? I/Logs: Service running 3
05-15 19:08:45.097 30097-31891/? D/Logs: result : 77
05-15 19:08:45.097 30097-31891/? I/Logs: Service running 1
05-15 19:08:48.426 30097-31974/? D/Logs: result : 77
05-15 19:08:48.426 30097-31974/? I/Logs: Service running 2
05-15 19:08:48.868 30097-31981/? D/Logs: result : 77
05-15 19:08:48.868 30097-31981/? I/Logs: Service running 3
05-15 19:08:50.137 30097-31891/? D/Logs: result : 77
05-15 19:08:50.137 30097-31891/? I/Logs: Service running 1
05-15 19:08:53.467 30097-31974/? D/Logs: result : 77
05-15 19:08:53.467 30097-31974/? I/Logs: Service running 2
05-15 19:08:53.908 30097-31981/? D/Logs: result : 77
05-15 19:08:53.908 30097-31981/? I/Logs: Service running 3
05-15 19:08:55.176 30097-31891/? D/Logs: result : 77
05-15 19:08:55.176 30097-31891/? I/Logs: Service running 1
05-15 19:08:58.508 30097-31974/? D/Logs: result : 77
05-15 19:08:58.508 30097-31974/? I/Logs: Service running 2
05-15 19:08:58.948 30097-31981/? D/Logs: result : 77
05-15 19:08:58.948 30097-31981/? I/Logs: Service running 3
05-15 19:09:00.218 30097-31891/? D/Logs: result : 77
05-15 19:09:00.218 30097-31891/? I/Logs: Service running 1
05-15 19:09:03.548 30097-31974/? D/Logs: result : 77
05-15 19:09:03.548 30097-31974/? I/Logs: Service running 2
05-15 19:09:03.985 30097-31981/? D/Logs: result : 77
05-15 19:09:03.985 30097-31981/? I/Logs: Service running 3

0条回答
登录 后发表回答