java多线程

java多线程

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

概念

流程:一个正常的程序运行。
每个程序都有一个运行顺序。这个序列是一个运行路径,或致电控制单元。

程: 就是进程中的一个独立的控制单元,线程在控制着进程的运行。

一个进程中至少有一个线程。或者说至少一个控制单元。
样例:jvm启动不止一个线程,还有负责垃圾回收的线程。

创建线程方式一

  • 继承Thread类
    步骤:
    1、定义类继承Thread
    2、复写Thread类中的run方法
    目的:把自己定义代码,放在run方法中,让线程运行。

    3、调用线程中的start方法
    start方法有两个作用。启动线程和调用run方法

通过运行这样的方法的运行结果的每次都不一样,由于多个线程获取CPU的运行权,CPU运行到谁。谁就运行。
也就是说,在某一个时刻,仅仅能有一个程序运行(多核CPU除外),CPU做着高速的切换。以达到看上去是同一时候运行的效果。

我们能够形象的把多线程的运行是互相争夺CPU的运行权。

多线程的一个特性:随机性

package com.vobile;

class Test extends Thread {
    public void run(){
        for (int j = 0; j < 20; j++){
            System.out.println("j = " + j + "-------------");
        }       
    }
}

class ThreadDemo1{
    public static void main(String[] args){
        Test test = new Test(); //创建一个线程

        test.start();

        for(int i = 0; i<20; i++){
            System.out.println("i= " + i + "+++++++++++++++++");
        }

    }
}

//运行结果
i= 0+++++++++++++++++
i= 1+++++++++++++++++
j = 0-------------
i= 2+++++++++++++++++
j = 1-------------
i= 3+++++++++++++++++
j = 2-------------
i= 4+++++++++++++++++
j = 3-------------
i= 5+++++++++++++++++
j = 4-------------
……

获取线程的名称 和对象

  • 名称
    线程都有自己默认的名称
    线程的名字为:thread-编号 编号从0開始
    获取名称:getName()
    设置名称:setName(); 或者构造函数的方式进行名称设置
  • 获取对象
    static Thread currentThread();方法

创建线程方式二

  • 实现Runnable接口
    1、子类覆盖接口中的run方法。

    2、通过Thread类创建线程,并将实现了Runnable接口的子类对象作为參数传递给Thread类的构造函数。

    3、Thread类对象调用start方法开启线程。

多线程安全问题

  • 比如:买票问题,出现了不该出现的票
  • 问题原因:
    当多条语句在操作同一个线程的共享数据时,一个线程对多条语句仅仅运行了一部分,还没有运行完成,而还有一个线程參与进来运行,导致共享数据错误。
  • 解决的方法
    对多条操作共享数据的语句。仅仅能让一个线程运行完,在运行过程中,其它线程不能够參与运行。

    对象如同锁。持有锁的线程能够在同步中运行。没有锁的线程,即使获得CPU的运行权,也进不去。

    由于没有获取锁。

  • 同步的前提
    1、必须使用2个或以上的线程
    2、必须多个线程使用同一个锁

  • 同步的优点
    解决可多线程的安全问题

  • 同步的缺点
    多个线程都须要推断锁,较为消耗性能

待续…

package com.vobile;

/** * 三个线程交替运行 * */
class Test extends Thread {
    private String name;
    public Test(String name){
        this.name = name;
    }

    public void run(){
        for (int j = 0; j < 20; j++){
            System.out.println(this.name + " test run... " + j);
        }       
    }
}

class ThreadDemo1{
    public static void main(String[] args){
        Test test1 = new Test("one"); //创建一个线程
        Test test2 = new Test("two");

        test1.start();
        test2.start();
        for(int i = 0; i<20; i++){
            System.out.println("main ... " + i);
        }

    }
}

版权声明:本文博主原创文章,博客,未经同意不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117056.html原文链接:https://javaforall.net

(0)
上一篇 2022年1月11日 下午2:00
下一篇 2022年1月11日 下午2:00


相关推荐

  • 十进制小数转换为二进制小数采用方法为乘2取整法?_小数点二进制转10进制

    十进制小数转换为二进制小数采用方法为乘2取整法?_小数点二进制转10进制十进制小数转换成二进制小数采用"乘2取整,顺序排列"法。具体做法是:用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的整数部分为零,或者整数部分为1,此时0或1为二进制的最后一位。或者达到所要求的精度为止。  然后把取出的整数部分按顺序排列起来,先取的整数作为二进制小数的高位有效位,后取的整数作为低位有…

    2026年3月3日
    5
  • 零基础学Java(13)方法参数

    零基础学Java(13)方法参数前言首先回顾一下在程序设计语言中关于如何将参数传递给方法的一些专业术语。按值调用表示方法接收的是调用者提供的值。而按引调用表示方法接收的是调用者提供的变量地址。方法可以修改按引用传递的变量的值,而不

    2022年7月29日
    8
  • 修改ligerui的display内容

    修改ligerui的display内容一般的 display 显示内容如下 display 手机号码 IMSI name imsi align left width 100 但是如果需要对内容进行操作后再显示 应该怎么样呢 可以使用如下的方式 render function 如 display 总流量 M name flowused align left widt

    2026年1月28日
    1
  • linux内核编译详解[通俗易懂]

    linux内核编译详解[通俗易懂]前言Linux内核是Linux操作系统的核心,也是整个Linux功能体现的核心,就如同发动机在汽车中的重要性。内核主要功能包括进程管理、内存管理、文件管理、设备管理、网络管理等。Linux内核是单内核设计,但却采用了微内核的模块化设计,支持内核线程以及动态装载内核模块的能力。Linux作为一个自由软件,在广大爱好者的支持下,内核版本不断更新。新的内核修订了旧内核的bug,并增加了许多新的特性。如果…

    2022年7月23日
    12
  • ubuntu与centos的对比和选择「建议收藏」

    ubuntu与centos的对比和选择「建议收藏」一、分别介绍CentOS(CommunityENTerpriseOperatingSystem)是Linux发行版之一,它是来自于RedHatEnterpriseLinux依照开放源代码规定释出的源代码所编译而成。RedHatEnterpriseLinux(RHEL)是企业发行版。它每五年左右更新一次,在系统的稳定性,前瞻性和安全性上有着极大的优势。由于CentOS…

    2025年9月6日
    9
  • 【OpenClaw 插件推荐】对接 Cursor CLI,让 AI 编程走出 IDE

    【OpenClaw 插件推荐】对接 Cursor CLI,让 AI 编程走出 IDE

    2026年3月16日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号