前言
在学习本教程之前,你对以下知识有所了解:
- 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毫秒
可以看到,我们成功执行了五个线程,并得到了预期的运行结果。
疑问
? 为什么多线程执行后的结果,毫秒不相同?
! 仔细看你会发现,这五次的多线程执行后的时间是由小到大
的,所以线程被提交是有间隔时间
并且是被顺序执行
的。
后语
这是多线程的基本使用,如果需要继续了解线程池的知识,请点这里。