我们之前学习的程序在没有跳转语句时,从上到下依次执行,那么我们现在需要设计一个程序,可以一边打游戏,一边听歌,如何实现?
要解决上述问题,我们需要使用多进程或者多线程来解决
并发与并行
并发:指两个或多个事件在同一时间段内发生
并行:指两个或多个事件在同一时刻发生(同时发生)
线程与进程
进程 是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多个进程;进程也是程序的一次执行过程,是系统运行程序的基本单位;是资源分配的基本单位;系统运行一个程序,即是一个进程从创建、运行到消亡的过程
线程 是进程中的一个执行单位,是独立调度的基本单位,负责当前进程中程序的执行,一个进程中至少有一个线程
一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序
一个程序运行后至少有一个进程,一个进程可以包含多个进程
线程调度
分时调度
所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间
抢占式调度
优先让优先级高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的是抢占式调度‘
主线程
JVM执行main方法,main方法会进行到栈内存,JVM会找操作系统开辟一条main方法,通向cpu的执行路径,cpu就可以通过这个路径执行main方法,而这个路径有一个名字,叫main(主)线程
public static void main(String[] args){
person p1=new person("张三");
p1.run();
person p2=new person("李四");
p2.run();
}
public class person {
private String name;
public void run(){
for(int i=0;i<10;i++)
System.out.println(name+"--->"+i);
}
public person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
创建多线程程序的第一种方式
Java使用Java.lang.Thread类代表线程,所有的线程对象都必须是Thread类或者子类的实例,每个线程的作用是完成一定的任务,实际上就是执行一段程序流即一段顺序执行的代码。Java使用线程执行提来代表这段程序流。Java通过继承Thread类来创建并启动多线程的步骤
public static void main(String[] args){
//创建Thread类的子类对象
MyThread mt=new MyThread();
//调用Thread类中的方法start方法,开启新的线程,执行run方法
//void start() 结果是两个线程并发的运行
mt.start();
for(int i=0;i<10;i++)
System.out.println("main:"+i);
}
public class MyThread extends Thread {
@Override
public void run(){
for(int i=0;i<10;i++)
System.out.println("run:"+i);
}
}
根据输出结果,我们可以知道多线程是随机性打印结果