多线程序:
如果程序只有一个执行路径,那么该程序就是单线程程序
如果程序有多条执行路径,那么该程序就是多线程程序
多线程内容:①多线程概述 ②多线程实现方案 ③线程调度和线程控制 ④线程生命周 ⑤线程同步 ⑥死锁 ⑦线程间通信 ⑧定时器的使用
什么是进程?
就是正在运行的程序。
是系统进行资源分配和调用的独立单位。 每一个进程都有它自己的内存空间和系统资
源
多进程有什么意义?
就可以在一个时间段内执行多个任务 提高CPU的使用率
问题: 一边玩游戏,一边听音乐是同时进行的吗?不是。因为单CPU在某一个时间点上只能做一件事情 而我们在玩游戏,或者听音乐的时候,是CPU在做 这程序间的高效切换让我们觉得是同时进行的。main方法运行在主线程中。
Java程序的运行原理:有Java命令启动jvm,接着有该进程创建了一个主线程去调用main方法
jvm虚拟机的启动是单线程还是多线程? 多线程。垃圾回收线程也要启动,否则很容易会出现内存溢出
多线程实现方案1:两种方式实现多线程: 方式一:A: 自定义类MyThread继承Thread类
B:MyTyread类里面重写run()? 为什么是run()方法呢? 不是类中的所有代码都需要被多线程执行, java提供了Thread类中的run()用来包含那些被多线程执行代码
C:创建对象
D:启动线程
一般来说,被多线程执行的代码肯定是比较耗时的
为什么调用run()方法是单线程呢?
run()方法直接调用其实就相当于普通的方法调用
面试题:run()和start()的区别?
run():仅仅是封装被该线程执行的代码,直接调用是普通方法 start():首先启动了线程,然后再由jvm取调用该线程的run()方法
IllegalTreadStateException:非法的线程状态异常为什么?因为这个相当于是my线程被调用了两次,而不是两个线程启动
如何获取线程名字呢? getName()
要获取main方法所在线程对象的名字,怎么办? Thread类提供了一个很好玩的方法: 用法:
public static Tread currentThread(); System.out.println(Thread.currentThread.getName());
线程的调度 ①分度调度模型 ②抢占式调度模型(Java使用的是这个)
Java默认优先级是多少?默认优先级是5。线程优先级的范围是:1~10
如何获取线程对象优先级? public final int getPriority();返回线程对象的优先级
如何更改线程对象优先级? public final void setPriority(int newPriority);返回线程对象的优先级
线程的控制:
①线程休眠 public static void sleep(long millis)
②线程加入(等待该线程终止) ·public final void join()
③线程礼让(暂停当前正在执行的线程对象,并进行其他线程) ·public static void yield()
④后台线程 ·public final void setDaemon(boolean on)
⑤中断线程 ·public final void stop()(已过时) ·public void interrupt()线程生命周期
面试题:线程的生命周期?
新建:创建线程对象;就绪:有执行资格,没有执行权;运行:有执行资格,有执行权 阻塞:由于一些操作让线程处于了该状态。没有执行资格,没有执行权;死亡:线程对象变成垃圾,等待被回收
多线程的实现方案2:
方式二:实现Runnable接口步骤:
A:自定义类MyRunnable类实现Runnable接口
B:重写run()方法
C:创MyRunnable类的对象
D:创建Thread类的对象,并把C步骤的对象作为构造参数传递用
方式二设置名字的方法:
方式一:对象名.setName(""); 方式二:Thread 对象=new Thread(接口类对象,"");
方式二有什么好处?A:可以避免由于java单继承带来的局限性B:适合多个相同的代码去处理同一个资源的情况,把线程同程序的代码,数据有效的分离,较好地体现了面对对象的设计思想。
如何解决线程的安全问题?
要想解决问题,就要知道那些原因会导致出问题:A:是否多线程环境 B:是否有共享数据 C:是否有多条语句操作共享数据(若CPU是原子性操作就不会出现问题)
解决问题方法是:(同步) 代码格式:synchronized(对象){}
解释:将有多条语句的操作包装起来。这个关键在这个对象,因此这个对象只能是一个
同步的特点:
同步的前提: 多个线程 多个线程使用的是同一个锁对象
同步的好处: 同步的出现解决了多线程的安全问题
同步的弊端: 当线程相当多事,因为每一个线程都会去判断同步上的锁, 这是很耗费资源的,无形中会降低程序的运行效率
静态该方法的锁对象是谁? 类的字节码文件对象(反射会讲)
线程安全的类:StringBuffer()、Vector