一.基本概念
1.程序
一段静态代码
2.进程
一段正在运行的程序,如360安全卫士
3.线程
一段程序内部的执行路径,多线程就是指一个进程中有多个线程,如打开360安全卫士后可以同时开展木马查杀与垃圾清理连个线程
每个线程拥有独立的运行栈和程序计数器,与其他线程共享进程中的
4.单核CPU与多核CPU
单核CPU是一种假的多线程,看似同时执行多个线程,实则每个单元时间(很短)只执行一个线程
多核CPU可以更好发挥多线程效率
5.并行与并发
并行是指,多个CPU同时执行多个任务,比如多个人做不同的事
并发是值,一个CPU(采用时间片切换)同时执行多个任务,如秒杀,多个人做一件事
二.多线程的创建与启动
一.创建一个继承自Thread类的子类(方式一)
1.重写run()方法
2.创建Thread子类的对象
3.调用start()方法
public class Main {
public static void main(String[] args) {
MyThread myThread = new MyThread();//创建对象
myThread.start();
for(int i = 0;i<10000;i++){
System.out.print("&&"+" ");
}
}
}
class MyThread extends Thread{//继承自Thread的子类
@Override
public void run() {//重写run()方法
for(int i = 0;i<10000;i++){
System.out.print(i+" ");
}
}
}
注意:
I.如果对象直接调用run()方法,只会体现类调用方法,而不会是创建新线程
II.对象执行过一次start()方法后不可以再让该对象调用start()方法
III.主线程main与自定义线程没有优先级之分,上述代码运行后会看到明显的交互现象
二.线程常用方法
1.void start():
启动线程,并执行对象的run()方法
2.void run():
线程在被调度时执行的操作
3.String getName():
返回线程的名称
4.void setName():
设置当前线程的名称
5.static Thread currentThread():
返回当前线程,在Thread子类中就是this,通常用于main与Runable类
6.static void yleId():
线程让步,暂停正在执行的该线程,把执行机会让给优先级相同或更高的线程,若没有则忽略此方法
7.join():
当前程序执行时调用其他线程join方法,会使当前线程阻塞,知道join()方法加入的join线程被执行完为止
三.线程优先级设置
1.线程优先级常量
I.MAX_PRIORITY:10
II.MIN_PRIORITY:1
III.NORM_PRIORITY:5
2.涉及方法
getPriority():返回线程的优先级
setPriority(int newPriority):改变线程的优先级
3.注意事项
线程创建时继承父类的优先级
低优先级只是获得调度的概率低,而不是一定在高优先级线程之后才会被调用
四.继承Runnable接口(方式二)
public class Main2 {
public static void main(String[] args) {
//3.创建实现类对象
myThread2 m = new myThread2();
//4.将此对象作为参数,传到Thread对象构造器中
Thread t1 = new Thread(m);
//5.调用start()方法
t1.start();
}
}
class myThread2 implements Runnable{//1.新建类实现Runnable接口
//2.实现Runnable接口中的抽象run()方法
@Override
public void run() {
for(int i = 0;i<100;i+=2)
System.out.println(i);
}
}
五.两种方式比较与选择
优先选择方式二:实现Runnable接口
1.没有单继承性的局限性
2.可实现数据共享
三.线程的生命周期
1.新建
当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态
2.就绪:
处于新建状态状态的线程被start()后,将进入线程的队列等待CPU时间片,此时它已经具备了运行的条件,只是没分配到CPU资源
3.运行
当就绪的线程被调度并获得CPU资源时,便进入运行状态,run()方法定义了线程的操作和功能
4.阻塞
在某种特定的情况下,被人为挂起或执行输入输出操作时,让出CPU并临时中止自己的执行,进入阻塞状态
5.死亡:
线程完成了它全部工作或提前出线异常导致结束