• java线程(一)


    java线程基础

    什么是线程?

      这里引用百度百科的一句话:“线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。”,简单来说线程cpu执行程序调度的最小单元。cpu通过调用执行一个个线程来促使程序能够正常运行。

    线程、进程、应用程序之间的关系

      在操作系统中一个进程就代表一个应用程序,如果将一个应用程序看做成一个实体的话,那进程就是一个正在运行的实体。一个应用程序中可以包含多个线程,同样进程中也可以包含多个线程,多个线程的组合称为了一个应用程序,如果一个应用程序中只有一个线程时,那改线程就是一个用用程序,我们称之为单线程程序!

    java中如何创建线程

      在java中有两种创建线程的方式,一种是实现Runnable接口的run()方法并将其对象实例传入Thread构造中来创建线程,一种是扩展Thread类的run方法来创建线程

    1         new Thread(new Runnable() {
    2             public void run() {
    3               //省略该线程要执行的代码
    4             }
    5         }).start();
    实现Runnable接口的方式
    new Thread(){
                @Override
                public void run() {
                    //省略该线程要执行的代码
                    super.run();
                }
            }.start();
    扩展Thread类的方式

     Thread类是java API提供的线程类,其通过start()方法来启动线程,在线程启动后执行run()方法中的代码,当run()方法中的代码执行完成后线程结束。在以上两种创建线程的方式中推荐使用实现Runnable接口的方式创建线程,因为这种方式更符合面向对象思想,且不会破坏java API原有代码的设计结构,扩展Thread类的方式不仅破坏了Java API原有的设计结构且不符合面向对象的设计思想。而且在Thread类的原始run()方法中也是调用Runable接口的run()方法来实现线程内容代码的调用。

     线程的几种状态

      线程大致上可以分为五种状态:创建、可运行(就绪)、阻塞(挂起)、运行、死亡。

      创建:通过new Thread()来创建线程实例,但未调用start()方法。这时线程的实例已经被创建出来,但并没有启动该线程。

      就绪:线程实例创建后调用start()方法。这时线程已经启动,可以被JVM调度交由cpu执行,但cpu目前并没有执行该线程。

      运行:线程已经启动,且已被JVM调度交由cpu执行,cpu正在执行该线程。

      阻塞:线程在运行时,调用线程对象的sleep()、join()方法或该线程已锁定的监视对象的wait()方法时现场进入阻塞状态,知道达到某种条件后进入就绪状态。

      死亡:当线程对象的run()方法执行结束,或在执行过程中出现错误导致线程异常结束,这时线程处于死亡状态。

    改变线程状态的几种方法详解

    线程对象产生的方法

      sleep():sleep方法使线程放弃cpu的使用权进入休眠状态一段时间,这段时间过后线程自动进入就绪状态。

      join():join()方法使线程放弃cpu的使用权并加入另一该线程,当另一个线程运行结束进入死亡状态后该线程自动进入就绪状态,否则将一直处于阻塞状态。

      yield():yield()方法使线程暂时放弃cpu的使用权进入就绪状态,但由于cpu的调度是随机的无法干预的所以有时yield()方法起不到任何效果。

      start():start()方法使线程对象启动进入就绪状态。注意:start()方法只能在线程实例创建后调用一次,当线程进入死亡状态时则无法再调用start()方法使其进入就绪状态。  

    线程锁定监视对象产生的方法

      wait():wait()方法使当前线程放弃cpu的使用权和该对象的锁,进入阻塞状态知道其他线程调用该对象的notify()或notifyall()方法后进入就绪状态。

      notify():notify()方法检测该对象上是否有等待的线程,若有一个或多个则随机挑选一个线程使其进入就绪状态。没有则不进行任何操作。

      notifyall():notifyall()方法检测该对象上是否有等待的线程,若有则使其全部进入就绪状态。没有则不进行任何操作。

      

  • 相关阅读:
    .NET/C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
    使用UI Automation实现自动化测试--1-4
    使用npm命令下载sass时出现Error: not found: python2
    CentOS上安装Python3
    解决electron打包时,下载超时导致失败
    FJ省队集训2021
    微信小程序自定义封装组件-showModal
    react性能优化
    认识react虚拟Dom
    前端FileReader读取文件信息
  • 原文地址:https://www.cnblogs.com/wangzheand/p/6806274.html
Copyright © 2020-2023  润新知