一.基本的知识点:
#线程: 什么是线程: 线程的几种状态 实现方式和区别:##什么是线程 什么是进程
回答:线程就是一个程序的分割,一个程序在开始执行到结束执行的过程分割出来执行单元就是线程吧!
进程:一个qq就是一个进程,一个360就是一个进程,
##线程的几种状态
使用线程,那我们就需要准备线程,线程的创建的两种方式就是:
1. 一个就是实现一个类继承 Thread,实现里面的run()方法,并使用Starat来开启线程.
2. 实现一个Runable的接口,实现里面的run方法,将这个实现了Runable的方法传递到Thread中来开启线程.
3.还有一种不常见 使用ExecutorService、Callable、Future实现有返回结果的多线程.
第二: 不管哪种方式,开启的线程的调用的start的方法都是Threadl里面的方法来,开启的.
线程的第一个阶段就是 创建线程(new). 创建线程后调用strart方法,就是线程的就绪状态(Runabale);(此时,这个创建的线程就是加入到了可运行线程池中,等待获取cpu的使用权)
接下来就是: 运行状态 (RUNNABLE) 此时及时就绪状态的线程获取了cpu的使用权利,执行里面的run()方法.
线程的阻塞状态(Blocked) : 原因就是此时没有的cpu的执行权利,此时不在运行,
阻塞的三种情况:
1. 调用了 wait()方法,jvm会把该线程放到等待池中.
2. 同步阻塞,为了线程的安全,需要线程的安全,我们需要获取同步锁,同步锁此时被别的线程调用,jvm会把这个线程放置的锁池中.
3. 运行sleep方法或者是join()方法的时候
###总结:
☆☆线程的状态:
- 第一创建线程的状态
- 第二就是线程执行start()方法后处于就绪状态
- 第三就是 获取cpu后执行,就是运行状态
- 第四:阻塞状态 阻塞的分三种情形
- 第五:运行完毕 死亡状态
##说说线程中wait() sleep()之间区别
第一: 方法的来源不同: wait()是Obiect类中, sleep是在 Thread类中;
第二:就是执行过程中是不是是否同步锁,wait()方法在执行的过程中是会释放同步锁的,需要人们唤醒线程()使用noti或者是notifyall,但是线程执行Sleep后,是不会释放同步锁的,可以设置睡眠的时间,时间一到会自己尝试获取cpu执行权限来继续执行! 执行sleep()的线程也可以强制打断.
第三;方法的执行过程 wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而
sleep可以在任何地方使用;
第四; 关于处理异常 sleep需要处理异常,wait()不需要
##☆☆☆Final、finally、finanlize()的区别
- final是用来修饰属性 显示方法 修饰类的 作用 修饰变量表示的属性是不可变的, 修饰方法标识这个方法不能够被覆盖 修饰类,标识的类不能够被继承;
- finally异常处理中出现的,表示的是这个部分一定会执行,一般用于关流等操作.
- finanlize() 这个方法是Object类的一个方法,在垃圾(garbage)收集器(collector)执行的时候会滴啊用被回收队形的此方法,可以覆盖此方法提供垃圾收集时其他资源的回收,例如关闭文件等.
#线程安全
线程安全就是说多线程访问同一代码,不会产生不确定的结果。编写线程安全的代码是低依靠线程同步.
我们常见的线程安全的类.
(1)Vector是线程安全的,ArrayList是线程不安全的
(2)StringBuffer是线程安全的,StringBuilder是线程不安全的
(3)Hashtable是线程安全的,HashMap是线程不安全的
#多线程并发和怎么处理多线程并发操作(注意区别多线程的并行)
(1)并行就是两个任务同时运行,就是甲任务进行的同时,乙任务也在进行。(需要多核CPU)
(2)并发是指两个任务都请求运行,而处理器只能按受一个任务,就把这两个任务安排轮流进行,由于时间间隔较短,使人感觉两个任务都在运行。
(3)比如我跟两个网友聊天,左手操作一个电脑跟甲聊,同时右手用另一台电脑跟乙聊天,这就叫并行。
(4)如果用一台电脑我先给甲发个消息,然后立刻再给乙发消息,然后再跟甲聊,再跟乙聊。这就叫并发。
#线程同步的几种方法
二.Android中线程池
Android中的线程池好处: