- 前言
- 一、概念
- 1.进程、线程
- 1.1进程
- 1.2线程
- 2.多线程存在的意义
- 二、多线程的创建(两种方式)
- 1.继承Thread类
- 2.定义类实现Runnable接口
- 3.实现方式和继承方式有什么区别
- 4.多线程运行的状态
- 三、领悟
前言 一、概念 1.进程、线程 1.1进程
是一个正在进行中的程序,每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元。
1.2线程就是进程中一个独立的控制单元,线程在控制着进程的执行,一个进程中至少有一个线程。
举例:Java jvm启动的时候会有一个进程java.exe执行,该进程中至少有一个线程在负责Java程序的运行,而且这个线程运行的代码保存到main方法中,该线程称之为主线程,其中jvm在启动后不仅这一个线程在运行,还有一个垃圾回收的线程在运行。
提高代码执行效率。
二、多线程的创建(两种方式) 1.继承Thread类1.1 定义类继承Thread,复写Thread类中的run方法是为了将自定义的代码存储到run方法中,让线程运行。
1.2 调用线程的start方法,该方法有两个作用:启动线程,调用run方法。
1.3多线程运行的时候,运行结果每一次都不同,因为多个线程都获取cpu的执行权,cpu执行到谁,谁就运行,明确一点,在某一个时刻,只能有一个程序在运行。(多核除外),cpu在做着快速的切换,以到达看上去是同时运行的效果。我们可以形象把多线程的运行行为在互抢cpu的执行权。这就是多线程的一个特性,随机性。谁抢到,谁执行,至于执行多久,cpu说了算。
代码如下(示例):
public class shijian extends Thread{
public void run() {
for (int i = 0; i < 60; i++) {
System.out.println(this.getName() + "demo run---" + i);
}
}
}
public static void main(String[] args) {
shijian sj=new shijian();//创建一个线程
sj.start();//开启线程,并执行该线程的run方法
sj.run(); //仅仅是对象调用方法,而线程创建了但并没有运行
for (int x = 0; x < 60; x++) {
System.out.println("Hello World---"+x);
}
}
2.定义类实现Runnable接口
2.1 覆盖Runnable接口中的run方法:将线程要运行的代码存放到run方法中
2.2 通过Thread类建立线程对象
2.3 将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数
2.4 调用Thread类的start方法开启线程并调用Runnable接口子类的方法
代码如下(示例):
public class Ticket implements Runnable{
@Override
public void run() {
for(int i = 0; i < 100; i++)
System.out.println("T1.....running........");
}
}
//这是两个类
public class test {
public static void main(String[] args) {
Ticket ticket = new Ticket();
Thread t1 = new Thread(ticket);
t1.start();
}
}
3.实现方式和继承方式有什么区别
3.1 实现方式避免了单继承的局限性,在定义线程时建议使用实现方式
3.2 继承Thread类:线程代码存放在Thread子类run方法中
3.3 实现Runnable:线程代码存放在接口的子类run方法中
创建线程-运行—sleep()/wait()–冻结—notify()—唤醒
创建线程-运行—stop()—消亡
创建线程-运行—没抢到cpu执行权—临时冻结
三、领悟
只要认真去学习,必定会学会!!!!



