Android线程详解

来源:互联网 发布:mysql语句大全例子 编辑:程序博客网 时间:2024/06/05 00:20

线程的状态

线程有六种状态:
1. 创建:调用了new Thread(),尚未start()之前
2. 就绪:调用了start(),在内存中准备就绪,等待获取cpu
3. 运行:获取了cpu
4. 阻塞:暂时释放了cpu资源,可能释放了同步锁(sleep()释放了cpu,但是持有同步锁;wait()释放了cpu和同步锁)
5. 终止:run()代码执行完毕或程序异常退出(如手动将进程杀死)

状态之间的转换

这里写图片描述

这里写图片描述

线程的相关函数详解

wait()/wait(long)/wait(long,int):线程等待,是object的方法,在函数中调用,意为释放当前线程所持有的CPU和同步锁,进入等待状态

notify()/notifyAll():和wait()匹配使用,是object的方法,用于唤醒处于该对象监视器下的线程。notify()随机唤醒任一线程;notifyAll()唤醒该对象监视器下的所有线程。

sleep()/sleep(long)/sleep(long,int):线程休眠,属于Thread的方法。暂时释放CPU,但是会继续持有对象的同步锁。

join():等待该线程(调用了join()的线程)执行完毕,再执行当前线程(调用了Thread.join()方法所在的线程)。Thread方法,调用了wait()方法。

线程的实现方式

继承Thread

1.继承Thread

class TestThread extends Thread{        @Override        public void run() {            super.run();        } }

2.调用Thread.start()

TestThread testThread = new TestThread();testThread.start();

实现Runnable

1.实现runnable

class TestRunnable implements Runnable{        @Override        public void run() {        }    }

2.调用new Thread(new Runnable()).start()

new Thread(new TestRunnable()).start();

问:start()和run()有什么区别?
start()意为启动一个线程;然后在线程中再调用run()方法。而单独调用run()方法仅是执行了一块代码块,并不能实现子线程效果。