🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
###1、首先来了解一下线程和进程的概念 进程的概念: 进程是操作系统资源管理的最小单位,进程是一个动态的实体,他是程序的一次执行过程。也叫作一个控制单元 线程的概念: 线程是进程中独立的控制单元,线程控制着进程的执行。一个进程中至少有一个线程。 java VM(java虚拟机)在运行时启动了一个进程---java.exe 该进程在执行时,至少有一个线程在控制着java程序的运行,并且这个线程存在于java的main函数中, 该线程称之为java的主线程。 扩展:在JVM运行时,除了main函数中的线程在运行外,还有JVM中负责java垃圾回收的线程在运行。因此,java不是单线程运行程序。 ![](https://box.kancloud.cn/2016-03-31_56fcdcef9aa8f.jpg) ### 实现多线程的第一种方式(单继承方式): 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方法中。