线程创建和启动:
线程定义和线程实例化(两种方式)
1.子类继承Thread,重写Run方法------>new 子类()
2.实现Runnable接口------>调用Thread构造方法new Thread(Runnable target)
线程启动
调用Thread对象的Start方法
线程状态转换:
新状态:线程对象已经创建,但还没有调用start()方法
就绪状态:调用start()方法,但调度程序还没有把它选定为运行的线程(即还没有调用Run方法)
运行状态:被选定为当前执行的线程,执行Run方法
阻塞/等待/睡眠状态:某种事件发生,线程进入阻塞状态,带阻塞解除,重新回到就绪状态,等待调度。
死亡态:线程的Run方法完成时,就认为它死去。
线程控制方法:
1.睡眠
Thread.sleep()
使当前正在执行的线程暂停执行,开始睡眠,睡眠指定时长后,自动苏醒,进入就绪状态,而不是运行状态。
2.设置线程优先级
setPriority()
3.线程让步
Yield()理论上是让具有相同优先级的线程具有运行的机会,本身由当前执行的线程从运行状态回到就绪状态,但是可能会被再次选中,并不能保证真正的让步。
4.线程合并
在一个A线程中如果加入B线程.Join,则A线程会等B线程执行完,才执行。
线程同步和锁机制:
synchronized关键字
Java语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这个段代码。
当两个并发 线程访问同一个对象object中的这个加锁同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行 该代码块。
然而,当一个线程访问object的一个加锁代码块时,另一个线程仍然可以访问该object中的非加锁代码块。
当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
Wait释放当前线程在该对象上所获得的锁
当一个线程获得了对象的锁之后,即使该线程在Sleep,也不会释放这个锁。
总结:
这章的难点是对线程同步的理解与运用,不过,明白线程同步发生的场景,并把握住synchronized关键字的作用,也就是上述的几条,理解起来也就容易了些。