黑马程序员-----线程
来源:互联网 发布:js的初始化 编辑:程序博客网 时间:2024/05/17 01:05
------- android培训、java培训、期待与您交流! ----------
进程: 是一个正在执行中的程序
每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元
线程: 就是进程中的一个独立的控制单元
线程在控制着进程的执行
一个进程中至少有一个线程
java vm 启动的时候会有一个进程 java.exe
该进程中至少有一个线程,负责java程序的执行
而且这个线程运行的代码存在于main方法中
该线程称之为主线程
扩展:其实更细节说明jvm , jvm启动不止一个线程,还有负责垃圾回收机制的线程
问题:
1 如何在自定义的代码中 , 自定义一个线程呢?通过对api的查找,java已经提供了对线程这类事物的描述,就是Thread类
创建线程的第一种方式:继承Thread类
步骤:
1 定义类继承Thread
2 复写Thread类中的run方法
目的:将自定义的代码存储在run方法中,让线程运行
3 调用线程的start方法,
该方法有两个作用:启动线程 调用run方法
发现运行结果每一次都不同
因为多个线程都获取cpu的执行权,cpu执行到谁,谁就运行
明确一点,在某一时刻,只能有一个程序在运行(多核除外)
cpu在做着快速的切换,以达到看上去是同时运行的效果
我们可以形象的把多线程的运行行为,看成是程序在互相抢夺cpu的执行权这就是多线程的一个特性:随机性, 谁抢到谁执行,至于执行多长,cpu说的算
为什么要覆盖run方法呢?
Thread类用于描述线程
该类定义了一个功能,用于存储线程要运行的代码,该存储功能就是run方法也就是说Thread类中的run方法,用于存储线程要运行的代码
class ThreadDemo
{
public static void main(String[] args)
{
//for (int x = 0;x<400 ;x++ )
// System.out.println("Hello World!");
Demo d = new Demo();
d.start();//开启线程并执行该线程的run方法
d.run();//紧紧是对象调用方法,而线程创建了,并没有开启
}
}
线程运行的状态:
1 被创建状态 : new一个Thread类或者 Thread的子类
2 运行状态 : 既有执行资格,又有执行权的线程
3 临时状态(阻塞状态) : 具备执行资格,但没有执行权
4 冻结状态 : 不具备执行资格
有两种:sleep(time) 睡眠状态 time的时间到自动唤醒,结束冻结状态
wait() 等待状态 只有notify()才能唤醒结束冻结状态,否则永远冻结
5 消亡状态 : stop()方法
或者 run方法执行结束
原来线程都有自己默认的名称
Thread-编号 该编号从0开始
比如 Thread-0 Thread-1currentThread() : 获取当前线程对象 标准通用方法
getName() : 获取线程名称设置线程名称 : setName()或者构造函数
创建线程的第二种方法 : 实现Runnable接口
步骤:
1 定义类实现Runnable接口
2 覆盖Runnable接口中的run方法
将线程要运行的代码存放在该run方法中3 通过Thread类建立线程对象
4 将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数
为什么要将Runnable接口的子类对象传递给Thread的构造函数
因为,自定义的run方法所属的对象是Runnable接口的子类对象
所以要让线程去执行指定对象的run方法,就必须明确该run方法所属的对象5 调用Thread类的start方法开启线程并调用Runnable接口子类的run方法
实现方式和继承方式有什么区别呢?
实现方式的好处 : 避免了单继承的局限性
在定义线程时,建议使用实现方式 (最常用的)
两种方式区别:
继承Thread : 线程代码存放在Thread子类run方法中
实现Runnable : 线程代码存放在接口的子类的run方法中
- 黑马程序员之多线程
- 黑马程序员-----线程复习
- “黑马程序员”~线程例题
- 黑马程序员_线程
- 黑马程序员 线程总结
- 黑马程序员:线程池
- 黑马程序员-线程同步
- 黑马程序员-线程入门
- 黑马程序员----线程
- 黑马程序员-线程
- 黑马程序员-----线程
- 黑马程序员:java线程
- 黑马程序员--线程池
- 黑马程序员--C#线程
- 黑马程序员_线程
- 黑马程序员_线程
- 黑马程序员-----线程
- 黑马程序员---深入线程
- hibernate:list与iterator区别
- 黑马程序员_银行业务调度
- Java中的EL和JSTl
- 我的2012
- C++向函数模版传递 const类型,数组类型
- 黑马程序员-----线程
- Android的消息提示:Toast与Notification的使用
- StringBuilder与StringBuffer的区别
- 深入探讨C++中的引用
- HDU 4409 Family Name List 简单树操作
- 《野蛮妈妈结婚记》 观后感
- 哈希函数(Hash function)简介
- 正确理解c/c++中字符连在一起的运用
- 标准电阻值的由来