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

推荐订阅源

Apple Machine Learning Research
Apple Machine Learning Research
Recent Announcements
Recent Announcements
IT之家
IT之家
人人都是产品经理
人人都是产品经理
G
Google Developers Blog
Microsoft Azure Blog
Microsoft Azure Blog
博客园_首页
大猫的无限游戏
大猫的无限游戏
U
Unit 42
罗磊的独立博客
博客园 - Franky
WordPress大学
WordPress大学
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
M
MIT News - Artificial intelligence
SecWiki News
SecWiki News
V
Vulnerabilities – Threatpost
P
Privacy International News Feed
P
Palo Alto Networks Blog
F
Fortinet All Blogs
P
Proofpoint News Feed
博客园 - 叶小钗
C
CERT Recently Published Vulnerability Notes
T
Tor Project blog
Spread Privacy
Spread Privacy
S
Securelist
C
Cisco Blogs
I
Intezer
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Cyberwarzone
Cyberwarzone
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Privacy & Cybersecurity Law Blog
宝玉的分享
宝玉的分享
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Engineering at Meta
Engineering at Meta
S
Schneier on Security
C
CXSECURITY Database RSS Feed - CXSecurity.com
GbyAI
GbyAI
T
Troy Hunt's Blog
T
Threatpost
博客园 - 司徒正美
Y
Y Combinator Blog
Hugging Face - Blog
Hugging Face - Blog
AWS News Blog
AWS News Blog
T
The Blog of Author Tim Ferriss
G
GRAHAM CLULEY
N
Netflix TechBlog - Medium
酷 壳 – CoolShell
酷 壳 – CoolShell
Google DeepMind News
Google DeepMind News
Know Your Adversary
Know Your Adversary
S
SegmentFault 最新的问题

技术改变视野

为程序员、设计师打造的摸鱼社区:摸鱼派! - 技术改变视野 大白话 | 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 - 技术改变视野 大白话之Docker(叁):制作一个运行Tomcat服务端的Docker镜像 - 技术改变视野 Github仅保留指定文件/文件夹当前Commit,删除所有历史记录,清除「敏感信息」 - 技术改变视野 将Tomcat、MySQL从Linux迁移到Windows的心路历程(干货):令人恐惧的字符编码 - 技术改变视野 Spring: java.lang.NoSuchMethodError: clearCache | ClassNotFoundException | Error during artifact deployment 思路及解决办法 - 技术改变视野 大白话之Java反射-初学最迷的概念:能干啥?咋用? - 技术改变视野 大白话之Java面向接口编程:最“正经”的中文实例讲解,看不懂来打我! - 技术改变视野 大白话 | 课堂实践:使用Iterator对数组进行遍历 - 技术改变视野 大白话之fail-fast | fail-safe:为什么会有这个机制?它有什么作用? - 技术改变视野 刨根问底 | 大白话:在使用注解后,框架是怎么知道你哪个方法使用了注解的?用@RequestMapping注解举例详解! - 技术改变视野 大白话之必会Java Atomic | 线程一点也不安全(二):Atomic的ABA问题会导致什么情况?如何解决? - 技术改变视野 随笔 | 奇淫技巧 | Java:记return和短路运算符的妙用 - 技术改变视野 随笔 | Tomcat:续-从Linux迁移到Windows编码问题彻底解决 - 技术改变视野 大白话之AutoClosable接口 | try-with-resources:JDK1.7的新特性,提高重复回收效率 - 技术改变视野 大白话之Java多线程join方法:开局一张图,试学一分钟,你就费和我一样,理解介个方法 - 技术改变视野 大白话之Java Stream流:将类数组流化,便捷批量修改,通俗讲解! - 技术改变视野 Java 困扰三周の问题:使用byte[]或skip()方法读取字节流Stream文件尾部多/少/缺字节解决方法 - 技术改变视野 大白话之Java级联调用:一个类,一条语句,同时调用好几个方法,串成一串 - 技术改变视野
实例带你学会简单的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毫秒

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

疑问

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

后语

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