1多线程的概述2多线程(创建多个线程实例,并启动多个线程)的实现方式,main主方法是单线程的4多线程的实现方式5多线程模拟火车站售票出现问题7线程的声明周期
2017-10-26 21:19
716 查看
1多线程的概述:
进程:当前正在运行的程序,一个应用程序在内存中的执行区域(一块内存空间)。
线程:进程中的一个执行控制单元,执行路径(做的每一件事情可以看做一个线程)
一个进程可以有一个线程,也可以有多个线程(多线程)
单线程:安全性高,但效率低
多线程:安全性低,效率高(同时进行多个线程)如迅雷同时下载多个电影
2多线程(创建多个线程实例,并启动多个线程)的实现方式:
Thread类
写一个类继承Thread的子类,重写Thread的run方法(被测试类运行的方法),
测试类,创建线程实例:(和普通类一样new)子类名 变量名
= new 子类名();
启动线程:变量名.start();
String getName();获取线程的名字
Void setName(String name);修改线程的名字为name
多线程:cpu在执行顺序上不确定,在多个线程之间随机执行
3主方法是单线程的:
主方法在运行 的时候是单线程运行的
4多线程的实现方式:
Runnable接口
写一个子类实现Runnable接口,并重写public void run方法。
实现Runnable接口,不能直接用[getName好似静态方法]getName()方法;
必须先创建和获取线程Thread对象,用Thread对象调用getName方法。
//Static Thread currentThread() 返回当前线程对象:Thread t = Thread.currentThread();
T.getName();
测试类:创建线程实例:MyRunnable mr = new MyRunnable();
将子类创建的对象 传给Thread : Thread t = new Thread(mr);
//用 线程Thread对象调用getName方法。t.setName()
启动线程: t.start();
5多线程模拟火车站售票出现问题:
Static void sleep(long millis):让当前线程暂停一会,时间单位是毫秒
6分析火车站售票出现问题原因:
是因为不同的线程在进入if之后
Thread.Sleep方法让它休息一会,并没有卖出票,那下一个线程也会通过if判断,所以会出现-1 -2的情况
7使用同步代码块解决多线程案例中出现的问题:
问题出现的原因:1要有多个线程2要被多个线程所共享的数据3多个线程并发的访问共享的数据
同步:安全性高,效率低
不同步:效率高,但是安全性低
Synchronized:同步(修饰符),可以修饰代码块和方法,被修饰的带玫瑰和方法一旦被摸个线程访问,则直接锁住,其他的线程将无法访问
同步代码块:
Synchronized(锁对象){
需要锁住运行的代码
}
注意:锁对象要被所有的线程锁共享。
8同步方法:
Synchronized :使用关键字synchronized修饰的方法,一旦被一个线程访问,则整个方法全部被锁住,其他的线程无法再访问
Synchronized:注意
非静态同步方法的锁对象是this
静态的同步方法的锁对象是当前类的字节码对象(文件)
Get.class();获取字节码文件对象 或者类名.class();
9线程的声明周期:
生命周期:一个对象的从生到死的过程
新建 就绪 运行 死亡
创建线程对象 ——》具备了执行条件——》具备了执行条件——》线程对象变成了垃圾
没有具备执行权力 具备了执行权力
等待方法:等待wait();让当前的线程对象等待
唤醒notify();让等待的线程继续执行(是让线程回到就绪步骤)
进程:当前正在运行的程序,一个应用程序在内存中的执行区域(一块内存空间)。
线程:进程中的一个执行控制单元,执行路径(做的每一件事情可以看做一个线程)
一个进程可以有一个线程,也可以有多个线程(多线程)
单线程:安全性高,但效率低
多线程:安全性低,效率高(同时进行多个线程)如迅雷同时下载多个电影
2多线程(创建多个线程实例,并启动多个线程)的实现方式:
Thread类
写一个类继承Thread的子类,重写Thread的run方法(被测试类运行的方法),
测试类,创建线程实例:(和普通类一样new)子类名 变量名
= new 子类名();
启动线程:变量名.start();
String getName();获取线程的名字
Void setName(String name);修改线程的名字为name
多线程:cpu在执行顺序上不确定,在多个线程之间随机执行
3主方法是单线程的:
主方法在运行 的时候是单线程运行的
4多线程的实现方式:
Runnable接口
写一个子类实现Runnable接口,并重写public void run方法。
实现Runnable接口,不能直接用[getName好似静态方法]getName()方法;
必须先创建和获取线程Thread对象,用Thread对象调用getName方法。
//Static Thread currentThread() 返回当前线程对象:Thread t = Thread.currentThread();
T.getName();
测试类:创建线程实例:MyRunnable mr = new MyRunnable();
将子类创建的对象 传给Thread : Thread t = new Thread(mr);
//用 线程Thread对象调用getName方法。t.setName()
启动线程: t.start();
5多线程模拟火车站售票出现问题:
Static void sleep(long millis):让当前线程暂停一会,时间单位是毫秒
6分析火车站售票出现问题原因:
是因为不同的线程在进入if之后
Thread.Sleep方法让它休息一会,并没有卖出票,那下一个线程也会通过if判断,所以会出现-1 -2的情况
7使用同步代码块解决多线程案例中出现的问题:
问题出现的原因:1要有多个线程2要被多个线程所共享的数据3多个线程并发的访问共享的数据
同步:安全性高,效率低
不同步:效率高,但是安全性低
Synchronized:同步(修饰符),可以修饰代码块和方法,被修饰的带玫瑰和方法一旦被摸个线程访问,则直接锁住,其他的线程将无法访问
同步代码块:
Synchronized(锁对象){
需要锁住运行的代码
}
注意:锁对象要被所有的线程锁共享。
8同步方法:
Synchronized :使用关键字synchronized修饰的方法,一旦被一个线程访问,则整个方法全部被锁住,其他的线程无法再访问
Synchronized:注意
非静态同步方法的锁对象是this
静态的同步方法的锁对象是当前类的字节码对象(文件)
Get.class();获取字节码文件对象 或者类名.class();
9线程的声明周期:
生命周期:一个对象的从生到死的过程
新建 就绪 运行 死亡
创建线程对象 ——》具备了执行条件——》具备了执行条件——》线程对象变成了垃圾
没有具备执行权力 具备了执行权力
等待方法:等待wait();让当前的线程对象等待
唤醒notify();让等待的线程继续执行(是让线程回到就绪步骤)
相关文章推荐
- SE高阶(4):多线程(并发)—①创建启动方式和控制线程方法
- 23 API-多线程(多线程概述,多线程实现方案,线程控制常见方法,线程安全问题及解决)
- JAVA基础再回首(二十四)——多线程的概述、实现方式、线程控制、生命周期、多线程程序练习、安全问题的解决
- 线程 创建和启动线程的两种方式 实现Runnable接口 继承Thread类 重写唯一方法run()
- Java基础:多线程(1)--线程的概述、创建线程的方式、线程的多种状态、线程常用的方法
- 0019 Servlet容器的实现:单实例多线程的线程安全问题【基础】
- 解析Android应用启动后自动创建桌面快捷方式的实现方法
- 创建两个线程模拟火车站两个窗口售票程序
- Java 中的多线程-两种创建方式,定时器的应用,线程的安全问题可以用银行转账来说明
- Python使用面向对象方式创建线程实现12306售票系统
- 多线程基础知识第一篇:创建线程的方式及线程常用的方法
- 创建两个线程模拟火车站两个窗口售票程序
- Python使用面向对象方式创建线程实现12306售票系统
- Java【多线程知识总结(5)】比较继承Thread类创建线程和实现Runnable接口创建线程这两种方式
- C#实现在启动目录创建快捷方式的方法
- 黑马程序员_笔记_多线程(创建线程的第二种方式:实现Runable接口)
- 黑马程序员------多线程(No.1)(概述、线程的创建、安全问题、同步锁、同步函数)
- Delphi中多线程用Synchronize实现VCL数据同步显示 解决在线程中操作控件出现问题
- Java笔记3 多线程<1>线程概述、多线程的创建、多线程的安全问题、静态同步函数的锁、死锁
- 多线程创建 方法一: NSThread 创建线程的三种方式