IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 超容易看懂的java多线程开发1 -> 正文阅读

[Java知识库]超容易看懂的java多线程开发1

??首先要了解什么是进程(Process),什么是线程(Thread)。

??进程,即进行中的程序。比如qq之类的,当它运行起来之后计算机会为它分配系统资源,这就是一个进程。一个进程中可以包含若干个(至少一个)线程,比如qq中可能同时要提供多个聊天窗口的实时更新,就需要有多个线程共同运作。线程的运行由cpu安排调度(单核cpu也能模拟出多线程效果,即在多个线程之间快速切换,造成一种在同时进行的假象。不过真实的多线程还是要靠多个cpu实现)。

??我们在写java代码的时候,main函数就是一个线程入口,一般叫它主线程。

知道了基本概念之后,我们可以试着来写一个demo,有三个基本步骤:

??1.继承Thread类

??2.重写run方法

??3.执行start方法

public class LearnThread extends Thread{
    @Override
    public void run() {
        for(int i=0;i<500;++i){
            System.out.println(i+"--多线程启动--");
        }
    }

    public static void main(String[] args) {
        LearnThread t1=new LearnThread();
        t1.start();
        for(int i=0;i<500;++i){
            System.out.println(i+"--Main启动--");
        }
    }
}

??这样就是一个简单的demo,由于计算机运行速度不同,你可能在你的电脑上运行这段代码看不到多线程效果。但是没关系,你可以试着把两个for循环中i的上限值变大,或者看看我的运行结果(的一部分)。

415--多线程启动--
416--多线程启动--
417--多线程启动--
418--多线程启动--
488--Main启动--
419--多线程启动--
489--Main启动--
490--Main启动--
491--Main启动--
492--Main启动--

??显然,我的计算机是单核的,它在执行这个多线程程序中使用的策略正是交替执行各个线程,来造成多线程共同执行的假象。但是你仍然可以在这样的结果中得到有用的信息。我们在运行main函数时,系统开启了一个线程(主线程),它创造了一个LearnThread类,并且调用了这个类的start方法(start方法的作用是告诉CPU,这里有一个可以被执行的线程,至于什么时候执行它由CPU来安排。如果在这里我们不调用start方法,而是直接调用重写过的run方法,那么很不幸,CPU不会把它看成另一个可以被执行的线程,而只会认为这是主线程中的一个普通的函数调用,然后它会先循环输出五百次的“多线程启动”,接着输出五百次的“Main启动”)。此时,CPU知道现在有两个线程可以被执行,它会按照自己的策略去交替执行这两个线程,这也就是上面展示的交替输出的原因。如果你的CPU运行速度足够快,它可能还没来得及交替执行另一个线程,当下在运行的线程任务就已经结束了,这就是我让你把i的上限提高的原因。

??最后,让我们用一个简单的例子来结束这一小节。你可以仿造这个样例来写一个你自己的多线程样例来加深理解。

class threadTest extends Thread{
    String name;
    threadTest(String name){
        this.name=name;
    }
    @Override
    public void run() {
        for(int i=0;i<500;++i){
        }
        System.out.println(name+" finished!");
    }
}

public class LearnThread {
    public static void main(String[] args) {
        threadTest t1=new threadTest("线程1");
        threadTest t2=new threadTest("线程2");
        threadTest t3=new threadTest("线程3");
        t1.start();
        t2.start();
        t3.start();
    }
}

??下面是我的运行结果,看起来它并不和我调用start方法的顺序一致,但是你现在应该知道为什么会这样了。

线程1 finished!
线程3 finished!
线程2 finished!
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-07 22:29:52  更:2022-04-07 22:30:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:53:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码