zoukankan      html  css  js  c++  java
  • Java基础第十八天总结——多线程

    目录:

    1、基本概念:程序、进程、线程

    2、线程的创建和使用

    /*------------------分割线----------------------*/

    一、基本概念:程序、进程、线程

    程序:一段静态代码,静态对象

    进程:正在运行的一个程序,是一个动态的过程,是有声明周期的。

    线程:进程的进一步细化,是程序内部的一条执行路径。若同一时间并行执行多个线程,就是支持多线程的。

    每个线程拥有独立的运行栈和程序计数器(pc),线程切换开销小。

    一个进程中多个线程共享相同的内存单元/内存地址空间。

    一个Java应用程序至少有三个线程:main()主线程,gc()垃圾回收线程,异常处理线程。如果发生异常,会影响主线程。

    并行与并发:

    并行:多个cpu同时执行多个任务

    并发:一个cpu同时执行多个任务

    多线程的有点:

    1.提高应用程序的相应。增强用户体验。

    2.提高cpu利用率。

    3.改善程序结构。

    何时需要多线程:

    程序需要同时执行2个或多个任务

    程序需要实现一些需要等待的任务时,如用户输入、文件读写操作、网络操作、搜索等

    需要一些后台运行的程序时。

    二、线程的创建和使用

    Java语言的JVM允许程序运行多个线程,它通过java.lang.Thread类来体现

    Thread类的特性:

    每个线程都是通过某个特定Thread对象的run()方法来完成操作的,经常把run()方法的主体称为线程体

    通过该Thread对象的start()方法来启动这个线程,而非直接调用run()

    Thread类

    构造器

    Thread():创建新的Thread对象

    Thread(String threadname):创建线程并指定线程实例名

    Thread(Runnable target):指定创建线程的目标对象,它实现了Runnable接口中的run方法

    Thread(Runnable target,String name):创建新的Thread对象

    API中创建线程的两种方式:

    JDK1.5前2种:

    继承Thread类的方式

    实现Runnable接口的方式

    方式一:继承Thread类

    定义子类继承Thread类

    class HelloThread extends Thread{}

    子类中重写Thread类中的run方法

    创建Thread子类对象,即创建了线程对象

    调用线程对象start方法:启动线程,调用run方法

     注意点:

    1.如果手动调用run()方法,那么就是普通方法,没有启动多线程。

    2.run()方法由JVM调用,什么时候调用,执行过程控制都是由OS的CPU调度觉定

    3.要启动多线程,必须调用start方法

    4.一个线程对象只能调用一次start()方法启动,如果重复,则将抛出以上的异常“|IIegalThreadStartException”

    方式二:实现Runnable接口

    1.定义子类,实现Runnable接口

    2.子类重写Runnable接口中run方法

    3.通过Thread类含参构造器创建线程对象

    4.将Runnable接口的子类对象作为实际参数传递给Thread类的构造器中

    5.调用Thread类的start方法:开启线程,调用Runnable子类接口的run方法

    继承方法和实现方法的联系和区别

    public class Thread extends Object implements Runnable

    区别:

    继承Thread:线程代码存放在Thread子类run方法中

    实现Runnable:线程代码存放在接口子类的run方法中

    实现方法的好处:

    避免了单继承的局限性

    多个线程可以共享同一个接口实现类的对象,非常适合多个相同线程来处理同一份资源

    Thread类的有关方法

    void start():启动线程,并执行对象的run方法

    run():线程在被调度时执行的操作

    String getName():返回线程的名称

    void setName():设置该线程名称

    static Thread currentThread():返回当前线程。在Thread子类中就是this,通常用于主线程和Runnable实现类

    static void yield():线程让步

    join():当某个程序执行流中调用其他线程的join()方法时,调用现场将被阻塞,直到join()方法加入join线程执行完为止

    static void sleep(long millis):(指定时间:毫秒)

    stop():强制线程声明结束

    boolean isAlive():返回boolean,判断线程是否还存活

    线程的调度

     

    线程的优先等级

    >MAX_PRIORITY:10

    >MIN_PRIORITY:1

    >NORM_PRIORITY:5

    涉及的方法:

    >getPriority:返回线程优先值

    >setPriority(int newPriority):改变线程优先级

    说明:

    线程创建时继承父线程的优先级

    低优先级只能获得调度的概率低,并非一定是高优先级线程之后才被调用

    补充:线程的分类

    Java中线程分两类:守护线程、用户线程

    它们几乎在每个方面都是相同的,唯一区别是判断JVM何时离开

    守护线程是用来服务用户线程的,通过start方法前调用thread.setDaemon(true)可以吧一个用户线程编程一个守护线程

    gc就是一个典型的守护线程

    JVM中都是守护线程,当前JVM将退出

    形象理解:兔死狗烹,鸟尽弓藏

  • 相关阅读:
    git add用法
    git删除指定文件夹
    git相关命令
    Stacktrace: org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:5
    [程序员代码面试指南]数组和矩阵-子矩阵的最大累加和问题
    [程序员代码面试指南]二叉树问题-统计完全二叉树的节点数
    [排序]直接插入排序、希尔排序
    [程序员代码面试指南]判断字符数组中是否所有字符只出现一次(堆排序)
    [SpringBoot项目]笔记
    [计算机网络]知识点
  • 原文地址:https://www.cnblogs.com/zhoutie170821/p/11984363.html
Copyright © 2011-2022 走看看