📄 thread.txt
字号:
1 进程:一个运行着的程序; 有独立的内存空间2 线程:进程的一个执行流程; 多个线程共享相同的内存空间 代码的运行最终都体现都是 线程的运行 线程 减少内存的占用 和 提高运行效率(并发运行,所谓并发并不是同一时刻 运行多个线程,只是多个线程之间的切换速度非常快,让人感觉是同时运行而已) 单个CPU某个时刻只能运行一个线程 例如:java Test 1)启动虚拟机进程 2)虚拟机进程 创建 main 线程 3)由 main 线程 执行对应类的 main()方法3 线程运行时的特征: 1)使用 start()方法启动线程 2)一个线程对象只能启动一次 3)尽量不要重写 start()方法 4)多个线程可共享 同一个对象 的实例变量或静态变量4 线程编写: Thread Runnable 1线程类 继承Thread,重写run() 实现Runnable,实现run() 线程对象 Mythread t = new Mythread(); Mythread t = new Mythread(); 启动线程 t.start() new Thread(t).start;5 线程状态: 1)初始状态:线程类刚实例化; 2)就绪状态:线程对象 执行start()方法 (等待CPU权限) 3)运行状态:拿到CPU 运行线程 4)阻塞状态: a: 调用sleep()或join(); sleep()仍然持有锁,仅交出CPU执行权 b: 调用wait(); wait()释放锁,交出CPU执行权 进入对象的等待池(等待notify,然后进入锁池) c: 拿到CPU执行权,但未拿到锁,进入对象的锁池 5)死亡状态:线程运行完run()方法代码6 并发访问问题: 多个线程访问 实例变量或静态变量 而引起单个线程中变量值前后不一致 解决方法:加锁 synchronized 把多行语句(一般对实例变量进行操作)作为一个整体, 即便线程交出CPU执行权,其他线程也不能执行这些代码 public void m(){ 语句行1 synchronized(this){ 语句行2 语句行3 } 语句行4 } eg: public synchronized void m(){ 语句行1 语句行2 语句行3 } public synchronized void n(){ 语句行1 语句行2 语句行3 }//此时,锁的持有者为 this 对象.假若执行m方法的第2句时被阻塞了,但是m方法并没有结束。 锁的持有者并没有改变,所以 n方法仍然得不到锁,所以仍然处于 锁池 当中 public class A{ static int i=10; synchronized static void setI(int j){ i=j; } }//此时,锁的持有者为 A的类对象(类加载的时候)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -