一.进程
说到多线程,线程是依赖于进程存在的,所以我们首先应该想到是进程。
A:什么是进程?
答:进程就是正在运行的应用程序,进程与线程的区别就是,进程是系统进行资源分配和调用的最小单位。而线程是程序运行的最小单位,即使用cpu的最小单位。一旦进程被创建,就会有自己的内存空间和系统资源。
B:多进程的意义?
答:如果一个计算机是单进程计算机,那么这个计算机只能处理一个进程,但是实际生活中我们通常需要计算同时完成多项功能比如一边听音乐一边打游戏等等,这就需要多进程计算机,这些进程在高速的切换使用cpu,因此在宏观上是并行,实际在使用cpu上是串行的,提高了cpu的使用率。
二.多线程
A:什么是线程?
答:一个进程的内部又可以执行多个任务,每一个任务都可以看做是一个线程,线程是程序使用cpu的最小单位。
B:多线程的意义?
答:多线程的意义不是为了提高cpu的使用率,而是为了提高程序的使用率。我们可以这样理解,程序的执行就是在抢占cpu,多线程程序在运行时,那么抢到cpu的几率就会更大一些,那么cpu在多线程进程中使用的时间就会比单线程高一些,因此程序的使用率就会高一些,但是那个线程抢到cpu,这个是不确定的,因为多线程具有随机性。
C:Java程序的运行原理
答:java命令会启动Java虚拟机,即jvm,也即启动了一个应用程序,也就是启动一个进程,该进程会启动一个主线程,该主线程会调用某个类的main方法,因此main方法运行在主线程中。
问:jvm的启动是多线程吗?
答:是多线程,因为jvm的启动至少会启动一个主线程和一个垃圾回收线程,因此是多线程。
三.多线程的实现方式一
A:问:怎么实现多线程?
答:继承Thread类,该类是一个线程类。
B:1.问:启动线程使用的是那个方法?
答:使用的是start()方法
2.问:线程能不能多次启动?
答:不能,会发生异常
3.问:为什么要重写run方法?
答:run方法中封装的是多线程要执行的代码,该类是线程类,在这个类中,也可以写一些其他的方法,但是其他的方法封装的代码不都是需要多线程所执行的代码,因此我们必须重写run方法,run方法中封装的代码应该是多线程必须执行的代码。
run方法的书写规则:一般封装的是比较耗时的代码。
C:案例演示
1.获取和设置线程对象名称
a.public final String getName()//获取线程名称
public final void setName(String name)//设置线程名称b.获取和设置线程对象名称
public class Test {
public static void main(String[] args) {
//获取当前主线程的名称
Thread thread = Thread.currentThread();
System.out.println(thread.getName());//main
//自己也可以修改主线程的名字
thread.setName("主线程");
System.out.println(thread.getName());//主线程
MyThread th1=new MyThread();
th1.setName("线程一");
MyThread th2=new MyThread();
th2.setName("线程二");
//开启一个线程,注意不能使用对象去调用方法来开启一个线程,即不能直接调用run方法。
th1.start();
th2.start();
}
}
public class MyThread extends Thread {
@Override
public void run() {
super.run();
for(int i=0;i<100;i++){
//方法一,获取当前正在运行的进程对象,然后调用getName()来获取进程名字
// Thread thread = Thread.currentThread();
//System.out.println(thread.getName());
System.out.println(this.getName()+i);
}
}
}
2.线程调度及获取和设置线程优先级
a.public final int getPriority() //获取线程的优先级
public final void setPriority(int newPriority)//设置线程的优先级
b.线程的调度:分为分时调度和抢占式调度
分时调度:平均分配cpu的时间片是相同的,每个线程轮流的来使用cpu。
抢占式调度: 优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的 CPU 时间片相对多一些。
注:java中使用的是抢占式调度,那么优先级高的线程是不是就意味着,会严格按照这个优先级来执行线程,不是这样的,因为优先级只是说明该线程使用cpu的几率很大,但是多线程具有随机性,因此我们会看到有些优先级低的线程在优先级高的线程之前执行。
c.获取和设置线程优先级
public class Test {
public static void main(String[] args) {
MyThread th1 = new MyThread();
th1.setName("刘昊然");
MyThread th2 = new MyThread();
th2.setName("王宝强");
MyThread th3 = new MyThread();
th3.setName("陈思成");
//获取线程默认的优先级 5
System.out.println(th1.getPriority());
System.out.println(th2.getPriority());
System.out.println(th3.getPriority());
//重新设置线程的优先级 范围为1--10
// th1.setPriority(1000);IllegalArgumentException非法的参数异常
th2.setPriority(5);
th3.setPriority(3);
S