1.线程创建的两种方法:
- 继承Thread类,重写run方法
- 实现Runnable接口,创建runnable的实体对象,传给Thread来运行
- 详情可查看Thread源码注释
线程创建的两种方法
2.线程的启动运行
- 执行thread.start()方法,线程就启动了,线程只能启动一次,否者会抛出异常:java.lang.IllegalThreadStateException
- run()跟start()的区别是:run()方法只是线程启动后会调用的方法,start()方法才能启动线程
3.线程的停止
- stop()方法已过时,而且太过于暴力的中断线程,可能会引起问题,就不推荐使用了
- 推荐使用interrupt(),告诉线程要终止了,然后在线程里自行判断,完成收尾工作,然后关闭线程,这个方法可以打断sleep、wait、join,并抛出 InterruptedException 异常,而且会清除打断标记
- interrupted() 跟 isInterrupted() 区别,两个都是获取打断标记,但 interrupted()会清除打断标记
4.线程休眠
- sleep()方法是Thread的静态方法,让该线程休眠n毫秒
- sleep()方法被interrupt()打断,抛出异常,可以自行处理打断后的工作
- TimeUnit.SECONDS.sleep(5);这个等效Thread.sleep(5000);
- wait()是Object的方法,而且需要synchronized代码块里才能执行,否者报异常
- sleep()不会释放锁,wait()会释放锁,等待notify()唤醒再进入就绪状态
TimeUnit实现
MyThread myThread = new MyThread();
myThread.setName("MyThread");
myThread.start();
//主线程休眠5秒
try {
TimeUnit.SECONDS.sleep(5);
myThread.interrupt();
} catch (InterruptedException e) {
e.printStackTrace();
}
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable,"myRunnable");
thread.start();
//主线程休眠5秒
try {
Thread.sleep(5000);
thread.interrupt();
} catch (InterruptedException e) {
e.printStackTrace();
}
/**
* 继承Thread类
*/
class MyThread extends Thread {
@Override
public void run() {
while (true) {
//打断线程
if (interrupted()) {
//这里 Thread.currentThread().isInterrupted() 会是false -> true,但在interrupted()后,true -> false,被清除了标记
Log.d(TAG, Thread.currentThread().getName() + ":interrupted() : " + Thread.currentThread().isInterrupted());
break;
}
Log.d(TAG, Thread.currentThread().getName() + ":baozi");
}
}
}
/**
* 实现Runnable接口
*/
class MyRunnable implements Runnable {
@Override
public void run() {
while (true) {
//打断线程
if (Thread.currentThread().isInterrupted()) {
//这里 Thread.currentThread().isInterrupted() 会是false -> true
Log.d(TAG, Thread.currentThread().getName() + ":interrupted(): " + Thread.currentThread().isInterrupted());
break;
}
Log.d(TAG, Thread.currentThread().getName() + ":baozi");
}
}
}
网友评论