• Java线程


    进程的定义:

    是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.(进程一个应用程序)

    进程是程序(操作系统)运行资源分配的最小单位。资源包括:CPU,暖场空间等,统一进程中的许多线程共享该进程中的全部系统资源,进程与进程是相互独立。进程是系统进行分配和调度的一个独立单位。

    线程的概念

    在一个程序中同时运行的多个独立流程,每一个独立的流程就是一个线程

    线程是CUP调度的最小单位,必须依赖于线程而存在

    线程是 进程的一个实体,是CUP调度和分派的基本单位。它是比进程更小的,能独立运行的基本单位。线程自已基本上不拥有系统资源,只用拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈)

    线程无处不在。任何一个程序都必须要创建线程

    多线程的概念:

    一个进程中至少有两个或者两个以上的线

    线程的3要素(CPU,CODE,DATE)

    多线程的好处:提高工作效率,改善用户的体验

    线程开发的两组方式

            第一种方式

                    

    1. 通过继承Thread的方式

         2 .继承Thread类,并重写run方法实现线程的开发

         3.调用线程的start方法:启动线程,调调run()方法

                  

    1. public class MyThread extends Thread {
    2. @Override
    3. public void run() {
    4. for (int i = 0; i < 10; i++) {
    5. System.out.println("第一个线程的内容:" + i);
    6. }
    7. }
    8. }
    9. public static void main(String[] args) {
    10. // 创建一个线程对象
    11. MyThread myThread = new MyThread();
    12. // 启动线程 启动线程不能直接调用run 只能调用start
    13. myThread.start();

      

    线程的使用创建线程对象,调用线程的start方法

    不能直接调用线程的的run方法,否则就不是一个线程对象了

          第二中方法

            实现Runnable接口来实现

            


    1. 定义类实现Runnable接口
    2. 覆盖Runnable接口中的run方 将线程要运行的代码放在该run方法中。
    3. 通过Thread类建立线程对象。
    4. 将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。  自定义的run方法所属的对象是Runnable接口的子类对象。所以要让线程执行指定对象的run方法就要先明确run方法所属对象
    5. 调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。


    1. public class MyRunnable implements Runnable {
    2. @Override
    3. public void run() {
    4. for (int i = 0; i < 100; i++) {
    5. System.out.println("第二个线程:" + i);
    6. }
    7. }
    8. }
    9. public static void main(String[] args) {
    10. // 创建第二个线程Runnable需要依赖一个Thread对象才可以
    11. MyRunnable myRunn = new MyRunnable();
    12. Thread thread = new Thread(myRunn);
    13. // 启动线程 启动线程不能直接调用run 只能调用start
    14. thread.start();
    15. }

    实现了runnable接口的类只能说具有了线程的功能,不能说是一个线程,所以创建对象的时候必须依赖一个真实的线程对象

    线程的状态

    初始状态(创建了对象)

    可运行状态(调用了start方法)

    运行状态(调用了run方法)

    阻塞状态 (调用了seleep,join,wait方法)

    终结状态 (运行完毕)

    线程的常用方法

    Start() 启动方法  表示线程进入了可运行状态

    Seleep(int)  随眠方法,当前线程进入阻塞状态,在一定时间以后苏醒

    Join() 方法 被调用者优先执行,执行完毕后当前线程在执行

    Wait() 方法  当前线程进入阻塞状态,一直到对方唤醒自己才可以继续执行

    notifyAll()唤醒被阻塞的线程

    需要注意:wait(),notify()两个方法是Object类提供的

    线程优点:
    1.    加大了资源的利用效率
    2.    可以多个任务同时执行


    线程缺点:
    1.    降低了线程被执行的概率
    2.    消耗CPU资源过大
    3.    容易造成数据不安全
    4.    死锁

    线程的死锁

    如果两个线程同时调用对方线程的JOIN方法,互相希望对方先运行就会出现死锁的问题

    为解决线程之间安全性引入Java的索机制,而一不小心就会产生Java线程死锁的多线程问题,因为不同的线程都在等待那些根本不可能被释放的锁,从而导致所有的工作都无法完成。

  • 相关阅读:
    【中介者模式(Mediator)】使用Java实现中介者模式
    xv6---spinlock自旋锁
    【Linux】Stratis是什么?Stratis和LVM有什么关系和区别?
    前后端分离之权限管理
    先后在影酷/传祺E9/昊铂GT量产交付,这家ADAS厂商何以领跑
    SSM框架网上书城全套
    基于深度学习的YOLO目标检测研究-附Matlab代码
    【Unity记录】编写一个超实用的单例模式模板
    自制python搜索小工具,比电脑自带的还要快
    javascript二维数组(15)
  • 原文地址:https://blog.csdn.net/weixin_44793200/article/details/126222222