Java多线程
Java多线程
主线程:当Java程序启动时,一个线程会自动创建并立刻运行,该线程通常叫做程序的主线程(main thread)。主线程的优先级默认为5。程序进程中,由它产生其他线程,这些子线程的优先级继承自主线程。
- 线程创建的两种方式:
-
自定义类继承Thread类并重写其run()方法,其他任意类中默认构造自定义类对象即创建用户进程。
- 并发运行:调用用户线程类的start()方法,再显式调用重写的run()方法(本质为主线程调用该线程对象的run()方法)。
-
自定义类实现Runnable接口并实现run()方法,再在任意其他类中实例该自定义类对象后,Thread类使用带参的构造函数(参数为自定义类对象)实例一个对象即创建了用户线程。
- 并发运行:用户进程调用start()方法即可,run()方法在创建进程对象时会自动调用。
Runnable对应要完成的任务,Thread对应任务执行者。二者到底使用那个实现多线程要自己取舍。
-
线程的生命周期:
-
新建状态(New)
-
就绪状态(Runnale):进入就绪态的线程都位于运行池中,因为Java不区分就绪态和运行态。
-
阻塞状态(Blacked)
包含- sleep(milliseconds)方法进入的休眠状态、
- wait()方法进入的挂起状态,该状态得到notify()或notifyAll()消息才能重新进入就绪状态、
- 等待某个输入/输出完成、
- 同步锁的一个状态。
-
死亡状态(Dead)
-
-
线程调度
JVM采用的是抢占式调度模型。
线程抢占的四种方法:- 调整线程优先级:Thread类的setPriority(int)方法
- 线程让步:运行的线程调用yield()方法,只对同级或更高的其他线程生效,因为调用后该线程仍处于就绪态。
- 线程休眠:运行的线程调用sleep()方法,该方法不考虑线程优先级,因为线程调用后在休眠时间内属于阻塞状态。
- 合并线程:运行的线程调用其他线程的join()方法,调用后该线程被挂起(wait()方法进入的阻塞状态),直到目标线程执行结束才恢复运行。若添加了超时参数,则超时就返回。
-
后台线程
又称守护进程。作用:为其他线程提供服务的进程。JVM的立即回收线程就是一个典型的后台线程。主线程默认是前台线程,前台线程创建的线程默认也是前台线程。
- setDaemon(true)方法设置线程为守护进程
- isDaemon()方法判断是否为守护进程
-
线程互斥
-
共享变量和临界区:
共享变量:多个线程共享的数据区
临界区:对共享变量进行读/写操作的程序段
-
线程互斥:
多个线程要进入临界区操作,一个线程进入进行操作时,保证其他线程无法进入。
-
如何实现:
将对程序段中共享变量的操作(即临界区操作)变为原子操作(该操作是由一条命令组成)。Java中使用“对象锁“机制实现
-
“对象锁”机制实现:
- synchronized关键字
- 显式的Lock对象
-
-
线程同步
与线程互斥相反。线程之间相互协作来共同完成一些任务,就是线程同步。
实现:
-
join()方法
Thread类的方法
-
wait()、notify()和notifyAll()方法组合
java.lang.Object类方法
-

浙公网安备 33010602011771号