1、首先来了解一下线程和进程的概念
进程的概念:
进程是操作系统资源管理的最小单位,进程是一个动态的实体,他是程序的一次执行过程。也叫作一个控制单元
线程的概念:
线程是进程中独立的控制单元,线程控制着进程的执行。一个进程中至少有一个线程。
java VM(java虚拟机)在运行时启动了一个进程---java.exe
该进程在执行时,至少有一个线程在控制着java程序的运行,并且这个线程存在于java的main函数中,
该线程称之为java的主线程。
扩展:在JVM运行时,除了main函数中的线程在运行外,还有JVM中负责java垃圾回收的线程在运行。因此,java不是单线程运行程序。
实现多线程的第一种方式(单继承方式):
1.继承自Thread类实现多线程
步骤:1)创建一个类继承Thread
2)覆写run方法
目的是存放多线程要执行的自定义代码。
3)在main函数中创建该类
4)使用start()方法调用该线程(start方法有两种含义:1,启动多线程。2,调用线程中的run方法)
public class Day1{
public static void main(String args[]){
DemoThread dt = new DemoThread();
dt.start(); //用于启动线程,并自动执行run方法。
dt.run(); //只是单纯的对象调用,在主线程中执行,并不开启子线程。
for(int i=0;i<50;i++){
System.out.println("main run-----"+i);
}
}
}
class DemoThread extends Thread{
public void run(){
for(int i=0;i<50;i++)
System.out.println("demo run-----"+i);
}
}
我们发现运行同一个程序,他们的运行结果却不太相同,
这是多个线程都获取系统的CPU资源,CPU执行到谁,谁就运行。
CPU在某一时刻只能执行一个程序(多核除外),CPU在做着快速的切换,以达到看上去是在同时执行的效果。
我们通过打印输出,来判断到底是哪一个线程抢占到了CPU的资源。
Thread类的意义-----用于描述线程。
该类定义了一个功能,用于存储线程要运行的代码,而这个存储功能就是run方法。
run方法中存储线程要执行的 自定义代码块。
而start方法用于启动线程,并自动执行run方法。
Thread类中提供的常用的方法:
static Thread currentThread: 返回当前正在执行的线程对象的引用
String getName();返回当前线程的名称。
当使用Thread的无参构造创建线程实例时,java虚拟机会自动为线程创建一个名字。(以Thread-编号的格式)
static void sleep(long time) 使线程休眠time时间。
创建线程的第二种方式(实现Runnable接口):
实现Runnable 接口来实现多线程:
步骤:
1)创建类实现Runnable接口
2)实现Runnable接口中的run方法
3)创建Thread对象
4)将Runnable对象作为实际参数传递给Thread的构造方法
5)调用Thread类的start方法,自动执行Runnable对象中的run方法
public class Day1Runable{
public static void main(String args[]){
DemoRunnable dr = new DemoRunnable();
Thread t1 = new Thread(dr);
Thread t2 = new Thread(dr);
Thread t3 = new Thread(dr);
Thread t4 = new Thread(dr);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
class DemoRunnable implements Runnable{
private int ticket=100;
public void run(){
while(true){
if(ticket>0)
System.out.println(Thread.currentThread().getName()+"--售票:"+ticket--);
}
}
}
问题:继承方式与实现方式有什么区别 1、避免了单继承的局限性 2、多线程执行代码位置不同: 继承Thread类:代码存放在Thread类的run方法中 实现Runnable类:代码存放在Runnable接口的run方法中。