多线程编程

由来:单任务os——多任务os
cpu来回切换进程——cpu来回切换线程
每一个进程都有分配独立的内存地址,(每一个程序就是一个进程)
每一个进程包含多个线程,线程是进程内部的分支。
同一个进程中的多个线程,共享地址内存空间。

线程的实现方式一:
继承Thread类,重写run方法
开启线程,要调用start方法——该方法会自动分配资源,然后调用this.run()
如果不是调用start方法,调用的是run方法——不会报错,只是普通的方法调用,不会开启新的线程。

线程的实现方法二:
实现Runnable接口,重写run方法
创建Thread对象,把Runnable接口的实现类对象传入
调用Thread对象的start方法

线程的状态:
新建状态 new Thread()
就绪状态 调用start(),但还未自动调用run方法
运行状态 start方法自动调用run方法《——》中断状态(在运行中,由于种种原因线程没有得到cpu的支持)
死亡状态 run方法结束,进行资源回收清理

线程中断的种种原因:
1、线程的优先级(最高十级、最低一级、默认为五)——提高被cpu执行的几率
2、由于输入/输出等待,造成线程进入中断状态——阻塞
3、休眠状态——sleep状态
4、等待与唤醒机制——来自object的wait、notify、notifyAll方法
5、礼让——yield让线程由运行状态进入就绪状态
sleep(0)与没有sleep(0)有区别,执行sleep(0),系统会重新计算优先级,进入cpu抢占模式。

锁机制(同步锁)
synchronized 可选修饰符,可以直接修饰方法
当多个线程访问同一资源的时候,有可能造成该资源数据混乱
同步方法:在资源身上加同步关键字synchronized
同步块:在调用资源的线程身上加上synchronized
过多的同步可能会产生死锁,死锁的解决办法:
线程间通信(wait、notify、notifyAll)

常见的线程:main主线程、gc线程、打印异常线程

原文地址:https://www.cnblogs.com/fengshaolingyun/p/6785081.html