Process 与 Thread 区别
概念
线程有独立的栈和工作内存
线程是独立的执行路径
在程序运行时 即使没有自己创建线程 ,后台也会存在线程 如 gc线程 主线程
main() 称为主喜爱呢城 为系统的入口点 用于执行整个程序
在一个进程中 如果开辟了多个线程 线程的运行由调度器安排 调度器与操作系统相关 先后顺序不能认为干预
对同一份资源操作时 会存在资源抢夺 需要加入并发控制
每个线程再自己的工作内存交互 加载和储存主内存控制不当会造成数据不一样 (线程同步)
线程生命周期
新生状态 就绪状态 运行状态 阻塞状态 死亡状态
新生状态 : 线程对象一旦创建就进入到新生状态 Thread t = new Thread();
就绪状态 : 调用start() 线程立即进入就绪状态 不是马上执行 而是等待cpu调度
运行状态 : 等cpu调度到之后进入运行状态
阻塞状态 : 当调用 sleep() wait 方法时候 或者同步锁的时候 线程进入阻塞 阻塞就是代码不往下执行 等待着 ,当解除堵塞状 态后 线程进入就绪状态 等待cpu调度
死亡状态 : 代码运行完成 自动停止线程 人工停止 ; 设置一个boolean tag的变量 然后控制tag 让程序跳出
static void yield() 对调度程序的一个暗示,即当前线程愿意产生当前使用的处理器。
void join(long millis) 等待这个线程死亡最多 millis毫秒。
static Thread currentThread() 返回对当前正在执行的线程对象的引用。
void join() 等待这个线程死亡。
void start() 导致此线程开始执行; Java虚拟机调用此线程的run方法。
void run() 如果这个线程使用单独的Runnable运行对象构造则调用该Runnable对象的run方法; 否则,此方法不执行任何操作并返回。
boolean isAlive() 测试这个线程是否活着。 boolean isDaemon()
String getName() 返回此线程的名称。
int getPriority() 返回此线程的优先级。
StackTraceElement[] getStackTrace() 返回表示此线程的堆栈转储的堆栈跟踪元素数组。
Thread.State getState() 返回此线程的状态。
ThreadGroup getThreadGroup() 返回此线程所属的线程组。
static void sleep(long millis) 阻塞线程后不会释放锁 结束后 线程进入就绪状态 重新等待cpu调用
static native void yield() 礼让线程 让当前正在指向线程暂停 不是阻塞线程 而是将当前线程从运行状态转入就绪状态 让cpu重新调度
final void join () 合并线程 待此线程执行完成后 再执行其他线程 其他线程阻塞 例: 再main线程之中调用子线程的join() 方法 子线程调用完成之后main线程才能执行
void setPriority(int newPriority)
设置线程的优先级 使cpu调度线程的时候 加大调用的概率
final void setDaemon(boolean on)
设置线程为守护线程
synchronized 注意 syn锁定的是对象 被锁定的对象不能被双线程使用 syn方法默认的是锁定this(本方法的对象)