目录:
1、基本概念:程序、进程、线程
2、线程的创建和使用
/*------------------分割线----------------------*/
一、基本概念:程序、进程、线程
程序:一段静态代码,静态对象
进程:正在运行的一个程序,是一个动态的过程,是有声明周期的。
线程:进程的进一步细化,是程序内部的一条执行路径。若同一时间并行执行多个线程,就是支持多线程的。
每个线程拥有独立的运行栈和程序计数器(pc),线程切换开销小。
一个进程中多个线程共享相同的内存单元/内存地址空间。
一个Java应用程序至少有三个线程:main()主线程,gc()垃圾回收线程,异常处理线程。如果发生异常,会影响主线程。
并行与并发:
并行:多个cpu同时执行多个任务
并发:一个cpu同时执行多个任务
多线程的有点:
1.提高应用程序的相应。增强用户体验。
2.提高cpu利用率。
3.改善程序结构。
何时需要多线程:
程序需要同时执行2个或多个任务
程序需要实现一些需要等待的任务时,如用户输入、文件读写操作、网络操作、搜索等
需要一些后台运行的程序时。
二、线程的创建和使用
Java语言的JVM允许程序运行多个线程,它通过java.lang.Thread类来体现
Thread类的特性:
每个线程都是通过某个特定Thread对象的run()方法来完成操作的,经常把run()方法的主体称为线程体
通过该Thread对象的start()方法来启动这个线程,而非直接调用run()
Thread类
构造器
Thread():创建新的Thread对象
Thread(String threadname):创建线程并指定线程实例名
Thread(Runnable target):指定创建线程的目标对象,它实现了Runnable接口中的run方法
Thread(Runnable target,String name):创建新的Thread对象
API中创建线程的两种方式:
JDK1.5前2种:
继承Thread类的方式
实现Runnable接口的方式
方式一:继承Thread类
定义子类继承Thread类
class HelloThread extends Thread{}
子类中重写Thread类中的run方法
创建Thread子类对象,即创建了线程对象
调用线程对象start方法:启动线程,调用run方法
注意点:
1.如果手动调用run()方法,那么就是普通方法,没有启动多线程。
2.run()方法由JVM调用,什么时候调用,执行过程控制都是由OS的CPU调度觉定
3.要启动多线程,必须调用start方法
4.一个线程对象只能调用一次start()方法启动,如果重复,则将抛出以上的异常“|IIegalThreadStartException”
方式二:实现Runnable接口
1.定义子类,实现Runnable接口
2.子类重写Runnable接口中run方法
3.通过Thread类含参构造器创建线程对象
4.将Runnable接口的子类对象作为实际参数传递给Thread类的构造器中
5.调用Thread类的start方法:开启线程,调用Runnable子类接口的run方法
继承方法和实现方法的联系和区别
public class Thread extends Object implements Runnable
区别:
继承Thread:线程代码存放在Thread子类run方法中
实现Runnable:线程代码存放在接口子类的run方法中
实现方法的好处:
避免了单继承的局限性
多个线程可以共享同一个接口实现类的对象,非常适合多个相同线程来处理同一份资源
Thread类的有关方法
void start():启动线程,并执行对象的run方法
run():线程在被调度时执行的操作
String getName():返回线程的名称
void setName():设置该线程名称
static Thread currentThread():返回当前线程。在Thread子类中就是this,通常用于主线程和Runnable实现类
static void yield():线程让步
join():当某个程序执行流中调用其他线程的join()方法时,调用现场将被阻塞,直到join()方法加入join线程执行完为止
static void sleep(long millis):(指定时间:毫秒)
stop():强制线程声明结束
boolean isAlive():返回boolean,判断线程是否还存活
线程的调度
线程的优先等级
>MAX_PRIORITY:10
>MIN_PRIORITY:1
>NORM_PRIORITY:5
涉及的方法:
>getPriority:返回线程优先值
>setPriority(int newPriority):改变线程优先级
说明:
线程创建时继承父线程的优先级
低优先级只能获得调度的概率低,并非一定是高优先级线程之后才被调用
补充:线程的分类
Java中线程分两类:守护线程、用户线程
它们几乎在每个方面都是相同的,唯一区别是判断JVM何时离开
守护线程是用来服务用户线程的,通过start方法前调用thread.setDaemon(true)可以吧一个用户线程编程一个守护线程
gc就是一个典型的守护线程
JVM中都是守护线程,当前JVM将退出
形象理解:兔死狗烹,鸟尽弓藏