黑马程序员——java基础之多线程

---------------------- 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培训、期待与您交流! ----------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值