1. 程序:为完成特定任务而编写的一段指令的集合
2. 进程:是程序的一次执行过程,或是正在运行的一个程序.是一个动态的过程:它有自身的产生,存在和消亡的过程-----生 命周期,
3. 线程:进程可以进一步细化为线程,是一个程序内部的一条执行路径,
一个进程可以支持并行多个线程,此时称之为多线程的
3.1 多线程的优点:提高用户体验,提高计算机程序的CPU利用率,
3.2 多线程使用情况:需要同时执行两个或多个任务时
程序需要实现一些需要等待的任务时,如用户输入,文件读写,网络操作等
需要一些后台运行的程序时
如何创建多线程:
- 方式一,继承Thread类:创建一个继承与Thread类的子类,再使用start()去调用重写后的子类的run方法
- Threas中常用的方法:
start():启动线程,
sleep():让当前调用此方法的线程睡眠之低昂的毫秒数,
run():创建的线程真正要执行的操作
currentThread:获取执行当前代码所在的线程
yield():主动释放CPU
join():线程a中调用了线程b的join()方法,此时线程a阻塞,直到线程b执行完成,a线程继续执行
isAlive():当前线程是否已经执行结束
stop():停止线程
//创建一个类继承与Thread类 class EvenThread extends Thread{ //重写run方法 @Override public void run() { for (int i = 0; i < 100; i++) { if (i%2==0) { System.out.println(i); } } } } public class ThreadTest { public static void main(String[] args) { //创建子类对象 EvenThread e=new EvenThread(); //调用线程的start()启动,只能通过start启动,否则按顺序执行,不再进入线程子类 e.start(); //调用匿名对象创建的线程的启动 t1.start(); //使用匿名对象创建线程 Thread t1=new Thread(){ @Override public void run() { for (int i = 0; i < 100; i++) { if (i%2==0) { System.out.println(i); } } } } }
线程优先级的设置:
如何设置优先级:setPriority():------>例如e1.setPriority(MAX_PRIORITY), MIN_ PRIORITY =1, NORM_ PRIORITY=5, MAX_ PRIORITY =10
如何获取优先级:getPriority()
注意:高优先级的线程会抢占低优先级的线程,但是不意味着高优先级的一定先执行完成
方式二:使用runable接口创建线程:创建runable的实现类,实现该接口,重写run方法
package threadtest; public class Ruanble { public static void main(String[] args) { //创建实现类的对象 Num num=new Num(); //将此对象作为参数传递给Thread类的构造器,创建Thread类的对象 Thread thread =new Thread(num); //调用start()启动创建的Thread对象 thread.start(); thread.setName("线程一"); } } //创建一个类实现Runable接口 class Num implements Runnable{ //重写run方法 @Override public void run() { for (int i = 0; i <100; i++) { if (i%2==0) { System.out.println(Thread.currentThread().getName()+"de素数wei:"+i); } } } }
比较实现Runable 和继承Thread的优劣: 对比后Runable要好于继承Thread
原因:
- 实现方式,解决单继承的局限性
- 实现的方式针对于有共享数据的情况,操作起来跟方便
- 实现的凡是可以做到数据和代码的分离
方式三:使用callable创建多线程
如何理解实现Callable接口的方式创建多线程比实现Runable接口创建线程方式强大
- Callable重写或实现的方法可以有返回值
- 重写或实现的方法可以抛出异常
- 使用Callable是可以使用泛型,并指明call()的返回值类型
- 与Runable扥不同是,他重写的是call()方法
方式四:使用线程池创建多线程(类似与数据库连接池)
提高响应速度(减少创建新线程的时间)
减低资源消耗(重复利用线程池中线程,不需要每次都创建)
便于线程管理:--------->>>>
corePoolSize:核心池的大小
maximumPoolSize:最大线程数
keepAliveTime:线程没有任务是最多保持多长时间会终止