目录
◎基本名词解释
1.程序:
为解决某种问题,使用计算机语言编写的一系列指令的集合
计算机中的程序,特指的是静态的,按装在硬盘上的代码集合
2.进程:
正在内存中运行的程序,是操作系统进行资源分配的最小单位
3.线程:
进程可以进一步细化为线程,是进程内一个最小的执行单元,是cpu进行任务调度的最小单位
举个栗子:
(1)运行中的qq就是一个进程,操作系统会为这个进程分配内存资源,一个聊天窗口就可以认为是一个线程,这个多聊天窗口同时被cpu运行,但这些聊天窗口集合属于进程(线程属于进程)
(2)main方法(主线程)从上到下按顺序执行,所以当接口被使用时,无法再次使用,主线程可以创建并启动其他的线程
早期没有线程,早期cpu执行的时候,是以进程为单位执行
进程单位很大的,当一个进程运行时,其他的的就不能执行,所以后来将进程中的多个任务,细化为线程,cpu执行单位也转化为更小的线程
进程和线程的关系:
1.一个进程中可以包含多个线程
2.一个线程只能隶属于一个进程
3.线程不能脱离进程存在
4.一个进程中至少有一个线程(主线程)java中的main方法就是用来启动主线程的
5.在主线程中创建并启动其他线程,所有的线程都共享进程内存资源
◎创建线程
需求:想在Java程序中有几个不相关的程序同时有机会执行
可以在Java中创建线程,把一些要执行的任务放在线程中执行,这样都拥有让cpu执行的权力
运行结果:
方式一:
自己定义的类继承(extend)Thread类
重写run()方法,在run()方法中来编写我们的任务代码
!切记不能直接取调用run()方法,就成了普通方法的调用,并不是启动线程!
创建自己定义的线程类对象,调用myThread.start();//启动线程,启动后不会立即执行,需要操作系统的调度
public class MyThread extends Thread{
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
System.out.println("hahah"+i);
}
}
}
方式二:
创建一个任务实现Runnable接口,对run方法进行重写
new一个Thread(任务对象),调用线程对象的的start()方法
main方法是用来启动Java主线程的
public class MyTask implements Runnable{
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
System.out.println("MyTask:"+i);
}
}
}
常用方式二的原因:
1.避免了单继承的局限性,因为Java是单继承过的,继承了Thread类,就不能继承其他类了
2.更适合多线程共享同一份资源的场景
◎Thread类中的常用方法
Thread表示线程,提供了很多的方法,来对线程进行控制
1.run();线程要执行的任务
2.start();启动Java线程
3.构造方法:
new Thread (Runnable runnable);
new Thread (Runnable runnable,String name);
4.setName("oooo");//为线程设置名字
5.t.sePriority(int p)//设置线程优先级(1-10之间)默认是5
t.getPriority();//获取优先级
优先级较高的线程先执行的概率大
操作系统线程任务的调度算法:
先来先服务算法(FCFS)调度算法
短作优先(SJF)调度算法
优先级调度算法
时间片轮转调度算法
高级相应比优先调度算法
6.Thread.sleep(long miles);//让线程休眠指定时间
7.t2.join();//其他线程等待t2线程结束(死亡)
◎线程状态
线程从创建到销毁
期间经历5个状态:
新建:new Thread();处于新建状态,此状态还不能被执行
调用start()启动线程,让线程进入到就绪状态
就绪:获得cpu的执行权后,线程进入到cpu执行
运行:运行中的线程可以被切换,回到就绪状态,也可能因为休眠等原因进入阻塞状态
阻塞:线程休眠时间到了 回到就绪状态,当线程中所有的任务执行完了,线程就自动销毁
死亡:
守护线程
也是线程中的一种,区别在于它的结束,如果一个线程是守护线程,那么,它会等其他线程的任务结束后自动终止,守护线程是为其他线程提供服务的,eg:jvm中的垃圾回收线程