System类 是个静态类,System.out.... 中的out 属性是个final,不可以被赋值,但是这个类中有个setOut()方法 可以
给out设置不同的流,因为这个setOut()方法是个本地方法,而不是Java语言实现的。本地方法可以绕过Java语言的
存储控制机制
什么是时候用静态方法
1.一个方法不需要访问对象的状态,其所需的参数都是通过显示参数提供的(Math.Pi)
2.一个方法只访问类的静态域
线程的上下文切换就是 存储和恢复CPU的状态,使得线程执行能够从中断点恢复执行。
线程优先级的特性:
1.继承性
比如A线程启动B线程,则B线程的优先级和A线程是一样的
2.规则性
优先级高的线程总是先执行完,但不代表优先级高的线程全部执行完
3随机性
优先级高的线程不能保证每一次都执行完
\
创建线程的方式
1.继承Thread类,重写run方法
2.实现Runnable接口
3 需要线程返回值 Callable
启动一个线程是调用start()还是run()
启动一个线程调用的事start()方法,使线程所代表的虚拟机处理机处于可执行的状态,这意味着它可以由JVM调度并执行,
这并不意味线程就会立即执行。run()方法是线程的启动后要执行的回调的方法
Thread类 底层: 有个Runnable 成员变量 作为参数的构造函数。启动线程的时候会判断线程是否有Runnable实现类存在,
一旦Thread t=new Thread(Runnable a) 实例化, 执行start()方法, 在这个方法中会判断Runnable实现类存在,有则
执行 Runnable实现类中的 run()方法,没有执行Thread的run()方法(没有方法体,需要被继承使用),以上就是线程的开启
为什么调用的是start而不是直接执行run()方法
Thread 的sleep 方法和 wait 方法有什么区别:
1.首先这俩个方法都乐意让线程暂停,但是 sleep()方法是线程类的静态方法,调用此方法是让线程暂停指定的时间,将执行权
(CPU)转交给其他线程,但是对象锁依然持有,休眠时间结束后自动恢复,变成就绪状态,准备获取执行权。wait()方法
是Object类中的方法,调用此方法不仅暂停当前线程,而且会失去执行权和对象锁,进入对象的等待池,只有调用notify或notifyAll方法时,才能唤醒等待池中的线程,进入等待池中,如果线程重新获取对象锁,才可以进入就绪状态。
线程sleep()方法和yield()方法有什么区别?
1.sleep方法给其他线程执行权的时候不考虑线程的优先级,因此会给低优先级线程的机会,yield()方法只会给相同优先级或
优先级更高的线程以运行的机会
2.线程执行sleep方法后处于暂停状态,而yield则处于就绪状态
3.sleep()方法声明抛出InterruptedException,而yield()方法没有声明任何异常;
4.sleep()方法比yield()方法(跟操作系统CPU调度相关)具有更好的可移植性。
\
wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁;
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要处理InterruptedException异常;
notify():唤醒一个处于等待状态的线程,当然在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且与优先级无关;
notityAll():唤醒所有处于等待状态的线程,该方法并不是将对象的锁给所有线程,而是让它们竞争,只有获得锁的线程才能进入就绪状态;\