多线程总结

多线程序:

        如果程序只有一个执行路径,那么该程序就是单线程程序

        如果程序有多条执行路径,那么该程序就是多线程程序

多线程内容:①多线程概述 ②多线程实现方案 ③线程调度和线程控制 ④线程生命周 ⑤线程同步 ⑥死锁 ⑦线程间通信 ⑧定时器的使用

什么是进程?

  就是正在运行的程序。

是系统进行资源分配和调用的独立单位。  每一个进程都有它自己的内存空间和系统资

多进程有什么意义?

就可以在一个时间段内执行多个任务 提高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()、Hashtable()22:06 2019/10/12

你可能感兴趣的:(多线程总结)