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多线程学习(一) -> 正文阅读

[Java知识库]Java多线程学习(一)

这是一篇多线程的入门学习,首先我也是初学java不久,对于java也说不上精通,但学了这么久还是对java有一些自己的见解。

一、多线程的基本概念

1、程序

它以某些程序设计语言编写,运行于某种目标结构体系上。

如:程序就像数学一样,要有一个懂数学的人,同时也会用计算的人去理解、分析、得出结果。以数学为基础的计算机要经过编译、链接而成为人难以解读,但可被计算机所解读的格式,然后运行。

2、进程

进程是程序的一次执行过程,或是正在运行的一个程序。是一个动态的过程:有它自身的产生、存在和消亡的过程。

3、线程

若一个进程同一时间并行执行多个线程,就是支持多线程的

如:

? ? ? ? 5个人去抢篮球,抢到的几率都一样,但不是都能抢到。(随机性)

1、为什么使用多线程

多线程可以提高效率。

如:

? ? ? ? 一个寺庙有10个和尚,假设他们一天要喝十桶水,如果一个和尚去挑水来回一共花费30分钟,那么他挑完10桶水一共需要5个小时。但如果同时5个和尚去挑水,每个人挑一桶水,假设来回时间不变那么一共需要1个小时,时间大幅缩小。及多个线程可以提高效率。

2、何时使用多线程

? ? ? ? 1、程序需要同时执行两个或多个任务。

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

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

二、?线程的创建和使用

? ? ? ? 1.Thread类

????????构造器:

????????Thread():创建新的Thread对象

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

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

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

? ? ? ? 2.1创建线程的方法一(继承)

????????创建线程的步骤:

????????1、定义一个类继承Thread。

????????2、重写run方法。

????????3、创建线程对象。

????????4、调用start方法,开启线程并让线程执行,同时还会告诉jvm去调用run方法。

public class Dome1 {
    public static void main(String[] args) {
        //3、创建线程对象。
        Subclass sub = new Subclass();
        //4 调用start方法,开启线程并让线程执行,同时还会告诉jvm去调用run方法。
        sub.start();
        for (int i = 0; i < 10; i++) {
            System.out.println("mian方法"+i);
        }
    }
}
//1、定义一个类继承Thread。
class Subclass extends Thread{
    @Override
    //2、重写run方法。
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(getName()+"正在运行"+i);
        }
    }
}

这里可以清晰的看见每一步的执行步骤。看看运行结果。

我们可以看见程序还是先执行mian方法中的循环,再去执行线程中的循环。mian方法便是主方法的训话,而Thread-0就是线程的循环。

????????2.2创建线程的方法二(接口)

????????1、定义子类,实现Runnable接口。

????????2、子类中重写Runnable接口中的run方法。

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

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

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

public class Dome2 {
    public static void main(String[] args) {
        //3、通过Thread类含参构造器创建线程对象。
        Subclas sub = new Subclas();
        //4、 将Runnable接口的子类对象作为实际参数传递给Thread类的构造器中。
        Thread thr = new Thread(sub);
        //给多线程命名为线程1
        thr.setName("线程1");
        //5、 调用Thread类的start方法:开启线程,调用Runnable子类接口的run方法。
        thr.start();
        //main函数输出奇数
        for (int i = 1; i <= 100; i++) {
            if (i%2!=0){
                System.out.println(Thread.currentThread().getName()+"输出的奇数是"+i);
            }
        }
    }
}
//1、定义子类,实现Runnable接口。
class Subclas implements Runnable{
    @Override
   // 2、子类中重写Runnable接口中的run方法。
    public void run() {
        //多线程输出偶数
        for (int i = 1; i <= 100; i++) {
            if (i%2==0){
                System.out.println(Thread.currentThread().getName()+"输出的偶数是:"+i);
            }
        }
    }
}

可以看到两种方式都是围绕着Thread和Runnable,继承Thread类把run()写到类中,Runnable接口是把run()方法写到接口中然后再用Thread类来包装, 两种方式最终都是调用Thread类的start()方法来启动线程的。我们来看看结果

?可以看见线程1和main方法是在互相抢夺线程,并且输出是随机不规律的。

? ? ? ? 3、多线程的应用

? ? ? ? 例题:火车票问题

????????????????既然了解多线程了,那么来看看多线程在程序中的应用,来看看下面的代码。

public class Dome3 {
    public static void main(String[] args) {
        //创建线程任务对象
        Subcla thr = new Subcla();
        //创建三个窗口对象              同时卖票
        new Thread(thr,"线程1").start();
        new Thread(thr,"线程2").start();
        new Thread(thr,"线程3").start();
    }
}
class Subcla extends Thread{
    /*
     * 执行卖票操作
     */
    //定义100张票(静态)
    public static int inp = 100;
    @Override
    public void run() {
        //每个窗口卖票的操作
        super.run();
        while (true){
            if (inp>0){
                                        获取当前线程对象的名字
                System.out.println(Thread.currentThread().getName()+"售卖的车票是"+inp--);
            }else
                break;
        }
    }
}

假设一共有100张票,三个窗口去卖这100张票。三个窗口去卖这100张票就会比一个窗口卖出的速度提高了两倍,看看结果。

?以上就是多线程的初步学习,从中可以看出单线程和多线程的不同。

多线程:

????????好处:一定程度上提高响应速度,在多核的情况下还是更能充分利用CPU资源的。

????????坏处:增加了调度和管理的开销,带来了一些不确定性,需要复杂的同步机制,避免死锁等等。

?

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-10-22 10:49:50  更:2021-10-22 10:51:04 
 
开发: 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年10日历 -2024/10/25 12:18:02-

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