我是小康小白,一个平平无奇的Java小白。热爱有趣的文字,生活和远方。

第1关:创建线程

任务描述

本关任务:创建一个Java线程执行特定任务。

相关知识
不知道你有没有发现,截止目前,我们编写的代码都是在main()函数中依照编写代码的顺序从上到下依次运行的。

但是我们平常使用的软件基本都是可以多个任务同时执行的,这其中的运行机制是什么呢?这一小节我们就来探讨。

本小节我们来学习Java中程序是如何同时执行多个任务的。

  1. 什么是线程、什么是进程
    在Java中要同时执行(如果是单核,准确的说是交替执行)多个任务,使用的是多线程,而要理解线程,我们先要了解什么是进程什么是线程。

一般的定义:进程是指在操作系统中正在运行的一个应用程序,线程是指进程内独立执行某个任务的一个单元。

怎么理解呢?

比如说QQ是是一个进程,如果你在和A朋友语音聊天的同时和B朋友打字聊天,同时还在QQ群下载图片,这三个
操作就相当于开启了三个线程,可以说有了线程之后我们设计的程序就可以一边执行A操作,一边执行B操作了。

线程和进程有什么区别呢?首先最直观的就是:一个进程可拥有多个线程。
具体比较:

  • 调度
    进程拥有资源;
    线程是调度和分派的基本单位;
    同一进程中线程的切换不会引起进程的切换;
    进程间的线程切换则会引起进程切换从而导致资源切换等。

  • 并发性
    进程:进程和进程之间可并发执行 ;
    线程:除了进程间的并发执行还可以线程之间并发执行;
    线程的并发性更高。

*拥有资源 *
线程并不能拥有资源,只有进程才拥有资源。

  • 系统开销
    进程创建、切换和撤销都会导致系统为之创建或者回收进程控制卡以及资源,但是线程的创建以及线程间的切换并不会引起系统做这些事儿,所以线程的系统开销明显更小。

如何创建线程
在这里我们主要掌握两种创建线程的方式。

1.继承Thread类;

我们可以使用继承Thread类的方式来创建一个线程。
创建一个类来继承Thread类,重写父类的run方法,就实现了创建我们自己的线程了。之后调用线程的start方法,就算是开启了一个线程了。

示例:

class MyThread extends Thread{private String name;public MyThread(String name) {super();this.name = name;}public void run() {System.out.println("线程" + name +"开始运行");for (int i = 0; i < 5; i++) {System.out.println("线程" +  name + "运行" + i);}System.out.println("线程" + name + "结束");}
}
public class Test {public static void main(String[] args) {Thread t = new MyThread("T!");t.start();Thread t2 = new MyThread("T2");t2.start();}
}

运行结果:

线程T!开始运行
线程T2开始运行
线程T!运行0
线程T2运行0
线程T!运行1
线程T2运行1
线程T!运行2
线程T!运行3
线程T!运行4
线程T2运行2
线程T2运行3
线程T2运行4
线程T2结束
线程T!结束

运行这段代码我们会发现,线程是交替运行的,并且每次运行输出的结果都不一样,输出是随机的。

2.实现Runnable接口。

最简单创建线程的方法就是实现一个Runnable接口了,实际上所有的线程都是直接或者间接实现了Runnable接口的,上一个例子中Thread类其实就实现了Runnable接口。

示例:

class MyThread implements Runnable {private String name;private Thread mythread;public MyThread(String name) {super();this.name = name;}public void run() {for (int i = 0; i < 5; i++) {System.out.println("线程" + name + "运行" + i);}System.out.println("线程" + name + "结束");}public void start() {System.out.println("线程开始: " + name);if (mythread == null) {mythread = new Thread(this, name);mythread.start();}}
}
public class Test {public static void main(String[] args) {MyThread t1 = new MyThread("T1");t1.start();MyThread t2 = new MyThread("T2");t2.start();}
}

运行结果:

线程开始: T1
线程开始: T2
线程T1运行0
线程T2运行0
线程T1运行1
线程T1运行2
线程T1运行3
线程T1运行4
线程T1结束
线程T2运行1
线程T2运行2
线程T2运行3
线程T2运行4
线程T2结束

在Java1.5版本之后,还提供了一种创建线程的方式: 通过Callable 和 Future 创建线程,这个我们将在之后的实训中学习到。

创建线程的两种方式对比

实现Runnable创建线程时,线程类只是实现了Runnable接口,还可以继承其他的类。继承THread类创建线程时,线程类继承了Thread类,不能再继承其他类。不过这种方式编写简单,如果需要访问当前线程,则无需使用 Thread.currentThread()方法,直接使用this即可获得当前线程。

java程序默认启动的线程

在Java中,每次程序运行至少启动2个线程。一个是main线程,一个是垃圾收集线程。因为每当使用Java命令执行一个类的时候,实际上都会启动一个jvm,每一个jvm实际在就是在操作系统中启动了一个进程。

编程要求
请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体任务如下:

使用继承Thread类的方式创建一个名为 ThreadClassOne 的类,重写的run方法需要实现输出0-10之间的奇数,输出结果如下:
1 3 5 7 9;使用实现Runnable接口的方式创建一个名为ThreadClassTwo的类,重写run方法,编写start方法,run方法需要实现打印0-10之间的偶数,输出结果如下:
0 2 4 6 8 10

测试说明
平台会对你编写的代码进行测试,若是与预期输出相同,则算通关。

因为需要完成两个文件的编写,所以你需要在右侧进行文件切换。平台会判断你定义的类是否是一个线程类,并且调用run方法,判断是否达到预期的输出结果。

实现代码

package step1;//请在此添加实现代码
/********** Begin **********/
public class ThreadClassOne  extends Thread   {public void run(){for(int i=1;i<10;i+=2){System.out.print(i+" ");}}
}
class ThreadClassTwo implements Runnable{public void run(){for(int i=0;i<=10;i+=2){System.out.print(i+" ");}}public void start(){}
}/********** End **********/
以上代码直接cv即可通过,但笔者建议理解后自己实践

EduCoder-JavaJava高级特性 - 多线程基础(1)实现代码以及相关知识点相关推荐

  1. EduCoder Java高级特性 - 多线程基础(1)使用线程

    第1关:创建线程 任务描述 本关任务:创建一个Java线程执行特定任务. 编程要求 请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体任务如下: 使用继承Threa ...

  2. 头歌Educoder——Java高级特性 - 多线程练习题

    文章目录 第1关:顺序输出 任务描述 相关知识(略) 编程要求 测试说明 代码示例 第2关:售票窗口 任务描述 相关知识(略) 编程要求 测试说明 代码示例 Station.java Task.jav ...

  3. 【头歌实训】Java高级特性 - 多线程基础(1)使用线程,使用 Callable 和 Future 创建线程

    任务描述 本关任务:通过 Callable 和 Future 来创建线程. 相关知识 从Java1.5版本开始,就提供了 Callable 和 Future 来创建线程,这种方式也是在Java程序员面 ...

  4. Java高级特性 - 多线程练习题

    第1关:顺序输出 任务描述 本关任务:利用多线程相关知识控制三个线程,依照先后顺序顺序输出. 相关知识(略) 编程要求 请仔细阅读右侧代码,在 Begin-End 区域内进行代码补充,使线程依照先后顺 ...

  5. 头歌Educoder——Java高级特性 - JDBC(上)

    第1关:JDBC连接数据库 任务描述 本关任务:使用jdbc连接数据库并完成创建数据库和创建表的操作. 相关知识 JDBC API提供以下接口和类: DriverManager:此类管理数据库驱动程序 ...

  6. Educoder–Java高级特性(第一章)- IO流【笔记+参考代码】

    Educoder–Java高级特性(第一章)- IO流[笔记+参考代码] 第一关 1.下列关于字节和字符的说法正确的是(BC) A.字节 = 字符 + 编码 B.字符 = 字节 + 编码 C.字节 = ...

  7. Educoder–Java高级特性(第二章)- 集合框架【笔记+参考代码】

    Educoder–Java高级特性(第二章)- 集合框架[笔记+参考代码] 第一关 编程要求 请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,创建ArrayList集 ...

  8. Educoder -Java高级特性 - IO流 4关

    Educoder -Java高级特性 - IO流 第一关 第二关:本关任务:使用输入输出流读写文件. 请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体任务如下: ...

  9. 【Java高级】多线程基础

    文章目录 1.jvm启动时的线程 2. 实现线程 2.1实现线程的第一种方式 2.2 实现线程第二种方法 3.线程生命周期 4.线程名字 5.线程的sleep 6.终止线程的睡眠 7.合理终止一个线程 ...

最新文章

  1. ubuntu64位 oracle 11g,64位Ubuntu安装Oracle11G
  2. 你和阿里资深架构师之间,差的不仅仅是年龄(进阶必看)
  3. [渝粤教育] 西南科技大学 工程测量 在线考试复习资料
  4. 2018第二届河北省大学生程序设计竞赛题解
  5. 互联网晚报 | 3月26日 星期六 |​ 竞拍规则优化,部分城市土地市场有所回暖;​​武汉房贷利率下调...
  6. linuc和python常用命令是一样的么_linuc和python常用命令是一样的么_python教程3--《linux常用命令》...
  7. 伺服电机回原点的原理_西门子V90伺服电机绝对值编码器回原点常用方法
  8. 2017级C语言大作业 - 合金弹头
  9. 嵌入式linux蓝牙通讯,开发板蓝牙通信问题,有这方面经验的请进
  10. Oracle truncate table 与 delete tabel的区别
  11. Ubuntu 16.04 解决RTL8111/8168/8411网卡有线连接网速慢的问题
  12. 【转】为什么你的硬盘容易坏?因为它转得实在是太快了
  13. 步进电机基础(2.1)- 定子相数的分类、结构、原理
  14. 一维数组——折半查找法
  15. 【学习笔记】NIM游戏与SG函数初探
  16. 为什么资源隔离对HTAP至关重要?
  17. 页面设计之论坛网页设计欣赏(前端)
  18. 未定义的标识符:IplImage
  19. 人工神经网络研究综述,人工神经网络分析方法
  20. Android 增量更新实现

热门文章

  1. 字节(计算机单位)-1024
  2. Oracle中对空字符串的判断
  3. 正则的应用--读取本地文件2--网页版解析--豆瓣
  4. 西南电力设计院之项目文档管理
  5. 下载telegram群组聊天消息
  6. 华为鸿蒙显示屏,8分钟,京东用户喜提全球首台华为鸿蒙系统荣耀智慧屏!
  7. Laya2.0 集成 Protobuf
  8. 《深海探测装备》学习笔记2(深海海底固定观测技术)
  9. 求每一年最大气温的那一天和温度
  10. Navicat实现数据库结构和数据同步