惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

小众软件
小众软件
A
About on SuperTechFans
博客园 - Franky
Engineering at Meta
Engineering at Meta
Recent Announcements
Recent Announcements
云风的 BLOG
云风的 BLOG
B
Blog
Microsoft Security Blog
Microsoft Security Blog
L
LangChain Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
U
Unit 42
Martin Fowler
Martin Fowler
Y
Y Combinator Blog
Stack Overflow Blog
Stack Overflow Blog
博客园 - 叶小钗
Vercel News
Vercel News
Apple Machine Learning Research
Apple Machine Learning Research
The Cloudflare Blog
Last Week in AI
Last Week in AI
腾讯CDC
Microsoft Azure Blog
Microsoft Azure Blog
爱范儿
爱范儿
V
V2EX
G
Google Developers Blog

技术改变视野

为程序员、设计师打造的摸鱼社区:摸鱼派! - 技术改变视野 大白话 | Java初学指♂男:“说说初学的误区与死结”( 壹 | 反射与Field ) - 技术改变视野 大白话之耦合性:什么是耦合性和内聚性?用编程语言实例讲解! - 技术改变视野 🎨 适用于 Solo / Bolo 的清新高级主题 —— Sakura | 移植自 WordPress 主题 - 技术改变视野 我在 GitHub 上的开源项目 - 技术改变视野 为IDEA/Git配置GPG密钥,点亮GitHub Verified Commit标识 - 技术改变视野 从 SpringMVC 转为使用 SpringBoot —— 手把手带你使用 Intellij IDEA 最快速地搭建 SpringBoot+MyBatis(无 XML)+Thymeleaf - 技术改变视野 无题 - 技术改变视野 年轻人的第一辆京牌电动车 - 技术改变视野 我们忙碌且漫长的一生,有多久是为自己而活? - 技术改变视野 一个最简单的实例理解Semaphore在Java中的作用 - 技术改变视野 说说《后浪》 - 技术改变视野 离线使用 Google Fonts:让你的网站更精致 | goofoffline 神器,一键下载生成离线字体库! - 技术改变视野 一个实例理解Java的接口(interface)用处与用法 - 技术改变视野 一个实例带你理解JavaBean - 技术改变视野 WebFilter-SpringBoot过滤器注解实例讲解 - 技术改变视野 实例带你搞懂Java多线程&&线程池之(壹):线程池与多线程的关系和区别 - 技术改变视野 实例带你搞懂Java多线程&&线程池之(贰):简单的线程池应用 - 技术改变视野 实例带你获取多线程Thread的返回值之 (壹) - Callable的运行 - 技术改变视野 实例带你获取多线程Thread的返回值之 (贰) - Callable配合线程池返回数据 - 技术改变视野 一个实例理解Java Runnable多线程用处与用法 - 技术改变视野 从零开始OpenSSL之 (壹) - 使用genrsa、rsa、rsautl生成公私钥 - 技术改变视野 从零开始 OpenSSL 之 (贰) - 使用 rsautl 解密文件 - 技术改变视野 大白话之Docker(壹):快速入门&&简单官方实例 - 技术改变视野 大白话之Docker(贰):简单部署一个Tomcat服务并发布内容 - 技术改变视野 大白话之从零讲解DVWA(壹)-SQL注入(SQL Injection) Low Level - 技术改变视野 大白话之从零讲解DVWA(贰)-SQL注入(SQL Injection) Medium/High Level - 技术改变视野 Java日志插件-Slog4J下载 - 技术改变视野 大白话之必会Java Atomic | 线程一点也不安全(一):比自增和synchronized更快速、靠谱的原子操作(调用C语言) - 技术改变视野 Log-MySQL root用户登录后无法查看数据库全部表/正常访问数据库 Access denied for user 'root'@'localhost' to database - 技术改变视野
实例带你学会简单的Java Thread多线程 - 技术改变视野
adlered · 2019-12-19 · via 技术改变视野

前言

在学习本教程之前,你对以下知识有所了解:

  • Java的类、方法、变量
  • extend的用法和用处
  • Java实例化

本篇教程难度:★☆☆☆☆

多线程是计算机的灵魂,目的是为了同时做很多事情

你可能不知道,早期的操作系统一次只能运行一个程序,如果要切换程序,必须关闭当前程序,早期的iPhone便是如此。

拷贝

废话少说,在你的IDE中新建一个Java项目或类用于存放本次多线程的代码。
我建议将类命名为:ThreadDemo,这样在拷贝代码后不需要修改类名。

复制下方代码到你的类中:

 1import java.text.SimpleDateFormat;
 2import java.util.Date;
 3
 4public class ThreadDemo {
 5    public static void main(String[] args) {
 6        //实例化当前类
 7        ThreadDemo threadDemo = new ThreadDemo();
 8        //调用动态类
 9        threadDemo.run();
10    }
11    
12    public void run() {
13        ThreadTest1 threadTest1 = new ThreadTest1();
14        threadTest1.run();
15        threadTest1.run();
16        threadTest1.run();
17        threadTest1.run();
18        threadTest1.run();
19    }
20}
21
22/**
23 * 线程1
24 */
25class ThreadTest1 extends Thread {
26    @Override
27    public void run() {
28        //获取当前时间
29        Date day = new Date();
30        SimpleDateFormat df = new SimpleDateFormat("yyyy年MM月dd日 HH点mm分ss秒SSS毫秒");
31        //打印当前时间
32        System.out.println("现在是:" + df.format(day));
33    }
34}

让我们分开理解

线程类

 1class ThreadTest1 extends Thread {
 2    @Override
 3    public void run() {
 4        //获取当前时间
 5        Date day = new Date();
 6        SimpleDateFormat df = new SimpleDateFormat("yyyy年MM月dd日 HH点mm分ss秒SSS毫秒");
 7        //打印当前时间
 8        System.out.println("现在是:" + df.format(day));
 9    }
10}

该类继承了Thread多线程类,所以这个类就支持多线程了~
该类中的方法:

1    @Override
2    public void run() {
3        //获取当前时间
4        Date day = new Date();
5        SimpleDateFormat df = new SimpleDateFormat("yyyy年MM月dd日 HH点mm分ss秒SSS毫秒");
6        //打印当前时间
7        System.out.println("现在是:" + df.format(day));
8    }

下方知识如果不理解可以直接跳过,在未来的学习中你自然会懂:
@Override 在本文表示对extend的Thread类的run()方法进行重写
run()方法是线程运行的方法,其中的方法完全由你来定义;

你需要知道的
你可以自由修改run()方法里面所有的内容,它将在接收到执行命令时被执行。

执行方法

 1    public static void main(String[] args) {
 2        //实例化当前类
 3        ThreadDemo threadDemo = new ThreadDemo();
 4        //调用动态类
 5        threadDemo.run();
 6    }
 7
 8    public void run() {
 9        ThreadTest1 threadTest1 = new ThreadTest1();
10        threadTest1.run();
11        threadTest1.run();
12        threadTest1.run();
13        threadTest1.run();
14        threadTest1.run();
15    }

首先主方法里面的代码是用来执行run()方法的。这么写的原因是因为主方法是静态方法,使其调用一个动态方法的原因是动态方法更加灵活,因此你可以无视主方法,直接阅读run()方法。
注意:此处的run()方法和ThreadTest类中的run()方法不是同一个方法。

继续看:

1        ThreadTest1 threadTest1 = new ThreadTest1();
2        threadTest1.run();
3        threadTest1.run();
4        threadTest1.run();
5        threadTest1.run();
6        threadTest1.run();

在该方法中,我们将ThreadTest类进行实例化,这样我们就能执行这个线程了。并且我们将该线程执行了5次。

运行!

现在,运行主方法,你会得到如下结果:

1现在是:2019年03月16日 12点21分20秒685毫秒
2现在是:2019年03月16日 12点21分20秒743毫秒
3现在是:2019年03月16日 12点21分20秒744毫秒
4现在是:2019年03月16日 12点21分20秒744毫秒
5现在是:2019年03月16日 12点21分20秒744毫秒

可以看到,我们成功执行了五个线程,并得到了预期的运行结果。

疑问

? 为什么多线程执行后的结果,毫秒不相同?
! 仔细看你会发现,这五次的多线程执行后的时间是由小到大的,所以线程被提交是有间隔时间并且是被顺序执行的。

后语

这是多线程的基本使用,如果需要继续了解线程池的知识,请点这里