---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
1. Java 多线程编程
Java 语言的优势之一就是线程处理较为简单。
一般操作系统都支持运行多个任务,一个任务通常就是一个程序,每个运行中的程序被称为一个进程,当一个程序运行时,内部可能包含多个顺序执行流,每个顺序执行流就是一个线程。
1)程序:指令+数据的byte序列,如:qq.exe。
2)进程:正在运行的程序,是程序动态的执行过程(运行于内存中)。
3)线程:在进程内部,并发运程的过程(方法)。
4)并发:进程是并发进行的,OS将时间划分为很多时间片段,尽肯能均匀分配给正在运行的程序,微观上进程走走停停,宏观上都在运行,这种都运行的现象叫——并发,但是不是绝对意义上的“同时”。
2. 创建一个线程
1)Thread 类:线程包含一个可以运行的过程(方法),Thread 类中包含方法run()。
2)创建一个具体线程,需要继承于 Thread 类。
3)覆盖 run() 方法(就是更新运行过程),实现用户自己的过程。
4)创建线程实例(一个线程)。
5)使用线程实例的 start() 方法启动线程,启动以后线程会尽快的去并发执行 run() 。
3. 线程的状态
1)new 新建
2)runnable 可运行(就绪)
3)running 运行(正在运行)
4)block 阻塞、挂起
5)dead 死亡
4. 线程状态管理
1)让出 CPU
Thread.yield() 当前线程让出处理器(离开 running),使当前线程进入 runnable 等待。
2)休眠
Thread.sleep(times) 使当前线程从 running 放弃处理器进入 block 状态,休眠 times 毫秒,再返回到 runnable,如果其他线程打断当前线程的block(sleep),就会发生InterruptedException。
5. 线程的常用属性
1)线程的优先级(资源紧张时候,尽可能优先)
t.setPriority(Thread.MAX_PRIORITY);
默认有 10 优先级,优先级高的线程获得执行的机会多。
机会的多少不能通过代码干预。
默认优先级是 5。
2)后台线程(守护线程,精灵线程)
t.setDaemon(true);
Java 进程的结束:当前所有前台线程都结束时,Java 进程结束后台线程,不管是否结束,都被停掉!
3)线程名字
getName();
4)当前线程
Thread main = Thread.currentThread();
6. 创建线程的两种方式
1)继承 Thread 类
1 继承 Thread 类,覆盖 run() 方法,提供并发运程的过程。
2 创建这个类的实例。
3 使用 start() 方法启动线程。
2)实现 Runnable 接口
1 实现 Runnable 接口,重写 run() 方法,提供并发运程的过程。
2 创建这个类的实例,用这个实例作为 Thread 构造器参数,创建 Thread 类。
3 使用 start() 方法启动线程。
class Person implements Runnable{
public void run(){
//...
}
}
Thread t = new Thread(new Person());
t.start();
3)使用 内部类/匿名类 创建线程
new Thread(){
public void run(){
System.out.println("Hi Thread");
}
}.start();
7. Sleep 的打断唤醒
1)Thread.sleep(times) 使当前线程从 running 放弃处理器进入 block 状态,休眠 times 毫秒,再返回到 runnable。
2)一个线程可以提前唤醒另外一个 sleep block 的线程,interrupt()打断/中断。
3)被唤醒线程出现 中断异常
8. 异步,同步
1)异步:并发,各干自动的,如:一群人上卡车。
2)同步:步调一致的处理,如:一群人上公交车。
9. 线程并发安全问题
1)多个线程并发读写同一个临界资源时候会发生“线程并发安全问题”。
2)常见的临界资源:
多线程共享实例变量
静态公共变量
3)使用同步代码块解决线程并发安全问题
synchronized(同步监视器){
}
1 同步监视器 是一个任意对象实例,是一个多个线程之间的互斥的锁机制,多个线程要使用同一个“监视器”对象,实现同步互斥。
2 常见写法:
synchronized(this){
}
3 如果方法的全部过程需要同步,可以简单使用 synchronized 修饰方法,相当于整个方法的 synchronized(this)。
4 尽量减少同步范围,提高并发效率。
10. Java 中同步的 API
StringBuffer , Vector 和 Hashtable 是同步的,StringBuilder,ArrayList 和 HashMap 不是同步的。
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------