什么是线程?
在我们使用的电脑中,每启动一个程序就是启动了一个对应的进程。而每一个进程又是众多线程在同时工作。所以,程序====》进程========》线程。
线程在执行的时候会去抢夺,cpu的时间片,获得该线程的执行权。时间片分配方式有两种,一种是均配式,一种是抢占式。java 属于抢占式。 每一个线程都有一个自己的栈空间,线程之间共享堆空间。
如何使线程。
1 实现Runnable 接口。
第二种 方式 继承Thread 父类
创建线程
创建线程 启动线程(statrt) 运行线程(执行run方法里面的代码) 阻塞线程(线程遇到 sleep yeild join 等) 线程死亡 (一个线程完成了所有的周期)
线程最多的是在启动与运行之间来回切换。
线程的优先级
1~10 个等级
getPriority()
返回线程的优先级。
阻塞的方法
sleep 停止多长时间后执行
yeild 让出改线程的执行权,给同级线程。
join 合并线程 让两个栈空间变成一个栈空间。
2 线程的 编程模型
同步编程模型,假定 t1 t2 两个线程,t1 执行完才能执行t2 这是 同步 编程模型。 t1 t2 分别执行,没有次序之分,属于异步编程模型。
为什么要用同步编程模型。
假定,我们有一个公共账户 有 5000 ,t1 t2 同事进行取钱操作 1000。但是,t1 取完钱后,还没来得及更新到账户有里,t2也来取钱,所以,这时t1 取完钱后剩余4000,t2取完钱后剩余也是4000,这肯定是错的,所以,需要用
synchronized
来实现线程同步,只有在t1取完钱后,t2 才能取钱。
这要保证了数据的安全,但是降低程序的执行效率。
被 synchronized 关键字 修饰的代码,会去拿当前对象的锁。
面试的时候总是问一些,同步的问题,其实只要知道这个锁有没有被别的占用,就知道其他线程执行该段代码会不会等待。
还有 类锁。