1.设置标记位,是一种不错的方式
static class MyThread extends Thread { WeakReference<MainActivity> weakReference; private boolean mRunning = false; public MyThread(MainActivity mainActivity) { weakReference = new WeakReference<>(mainActivity); } @Override public void run() { mRunning = true; while (mRunning) { //耗时操作 } } public void close() { mRunning = false; } }
2.thread.stop()不太安全
3.interrupt两种情况
一、线程处于阻塞状态,如sleep
二、用while(!isInterrupt){//...}来判断线程是否中断
Thread t =new Thread(new Runnable() { private long i; @Override public void run() { while (!Thread.currentThread().isInterrupted()) { i ++; Log.i("xbh", "i = " + i); } Log.i("xbh", "stop "); } }); t.start(); try { TimeUnit.MILLISECONDS.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } t.interrupt();也是通过置标记位的方式。
注意on变量是加了一个volatile关键字,因为多个线程都访问了这个变量(主线程和myRunnable),所以设置了这个关键字,当它的值变化的时候,所有的线程都会感知到它的变化。