1.进程是一个独立的运行环境, 进程可以是一个程序或者一个应用,线程是进程的一个执行的任务
2.多线程编程的好处,
多线程并发访问提高访问效率,并且多线程访问不用因为线程等待资源而空闲线程. 多线程可以充分利用多核CPU
4.可以继承Thread类并重写run()方法, 实现runnable接口,它直接传递给Tread构造函数 并创建thread对象.
5.创建线程,new 创建一个线程后,该线程没有被系统分配资源,这时线程处于创建状态
就绪状态, 线程调用start方法使系统为该线程分配资源,使线程进入就绪状态.
运行状态. Java运行系统通过调度选中一个处于就绪状态的线程,使其占有CPU并转为运行状态。此时,系统真正执行线程的run()方法。
阻塞和唤醒状态 线程调用sleep方法使线程进入睡眠指定时间,
线程调用wait方法使线程挂起, 当线程调用notify使线程执行运行状态.
死亡当线程调用 stop 或者interspter使线程进入死亡状态
6.线程直接调用run方法就像当于线程调用一个普通方法.
7.调用sleep方法或者wait,notify,notifyAll
Sleep使线程睡眠一段时间,是由线程本身控制, 例如.我要点火,烧水,煮饭. 我点完火,我想睡一觉之后再烧水然后煮饭. 控制权是由我自己控制.
Wait方法是其他对象对线程的控制. 其他对象相当于传话的功能. 例如我是厨师,我要点火,烧水,煮饭. 我点完火之后老板打电话告诉我停止.
Sleep和wait实际区别在于sleep是对线程的控制. Wait方法是线程之间的通讯问题
thisOBJ.notify()的时候,那么我就可以煮饭了,这个被暂停的线程就会从暂停处 继续执行.
1Sleep是继承thread类. Wait输入Object类
2wait方法只能在同步块或者方法中执行 sleep可以在任何方法中执行.
2,最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
Sleep抛异常, wait方法不需要抛异常.
8.线程分1-10个优先级 10优先级最高 1最低
12.线程之间的通讯是通过wait的notify方法 在同步块或者同步方法中运行
18.同步块更好. 因为他不会锁住整个对象.
- 线程不需要同步时, 可以调用threadLocal方法.
23.-----两个以上的线程永远处于阻塞状态,成为死锁. 避免死锁,
1.原子操作是事务的一个特性,是一个不可分割的执行单元.
2.线程调度:协同式 线程执行时间由线程本身控制, 线程把自己的工作执行完成后,自己切换到另一个线程上.
抢占式: 线程执行时间由系统控制.
4字符流和字节流的区别.
字节流单位是字节. 字符流的单位是Unicode码元 一个字符占俩字节
字符流一般只传输文本数据. 字节流可以传输任何数据.
------ 字节流不适用缓冲区 字符流适用缓冲区
字节流 继承outputstream 字符流继承 inputstreamreader
-----序列化serializa
7大量的从硬盘读取 需要适用字符流 因为字符流存在缓冲区 减少对硬盘的损伤
8.字节流 因为字节流可以将不同类型的数据转换成字节. 然后打印到数据源
outputsteamwtrite
19.流一般不需要关闭如果需要关闭 需要在fannally中关闭.
25.serlizible接口 字节流
- 当需要读写的时候 使用序列化. 被serlizible标记的对象可以实现读写功能
3反射 哪里用到反射
Class.forname(driver).newinstance() 现在很多框架都用到反射 hibernate和Struts
Java序列化
我们有时候将一个java对象变成字节流的形式传出去或者从一个字节流中恢复成一个java对象,例如,要将java对象存储到硬盘或者传送给网络上的其他计算机,这个过程我们可以自己写代码去把一个java对象变成某个格式的字节流再传输,但是,jre本身就提供了这种支持,我们可以调用OutputStream的writeObject方法来做,如果要让java 帮我们做,要被传输的对象必须实现serializable接口,这样,javac编译时就会进行特殊处理,编译的类才可以被writeObject方法操作,这就是所谓的序列化。需要被序列化的类必须实现Serializable接口,该接口是一个mini接口,其中没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的。
死锁和避免死锁
死锁是指两个以上的线程永远阻塞的情况,这种情况产生至少需要两个以上的线程和两个以上的资源。
避免嵌套锁,只在需要的地方使用锁和避免无限期等待是避免死锁的通常办法,
什么是TreadLocal
ThreadLocal用于创建线程的本地变量,我们知道一个对象的所有线程会共享它的全局变量,所以这些变量不是线程安全的,我们可以使用同步技术。但是当我们不想使用同步的时候,我们可以选择ThreadLocal变量。