EduCoder-JavaJava高级特性 - 多线程基础(1)实现代码以及相关知识点
我是小康小白,一个平平无奇的Java小白。热爱有趣的文字,生活和远方。
第1关:创建线程
任务描述
本关任务:创建一个Java线程执行特定任务。
相关知识
不知道你有没有发现,截止目前,我们编写的代码都是在main()函数中依照编写代码的顺序从上到下依次运行的。
但是我们平常使用的软件基本都是可以多个任务同时执行的,这其中的运行机制是什么呢?这一小节我们就来探讨。
本小节我们来学习Java中程序是如何同时执行多个任务的。
- 什么是线程、什么是进程
在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)实现代码以及相关知识点相关推荐
- EduCoder Java高级特性 - 多线程基础(1)使用线程
第1关:创建线程 任务描述 本关任务:创建一个Java线程执行特定任务. 编程要求 请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体任务如下: 使用继承Threa ...
- 头歌Educoder——Java高级特性 - 多线程练习题
文章目录 第1关:顺序输出 任务描述 相关知识(略) 编程要求 测试说明 代码示例 第2关:售票窗口 任务描述 相关知识(略) 编程要求 测试说明 代码示例 Station.java Task.jav ...
- 【头歌实训】Java高级特性 - 多线程基础(1)使用线程,使用 Callable 和 Future 创建线程
任务描述 本关任务:通过 Callable 和 Future 来创建线程. 相关知识 从Java1.5版本开始,就提供了 Callable 和 Future 来创建线程,这种方式也是在Java程序员面 ...
- Java高级特性 - 多线程练习题
第1关:顺序输出 任务描述 本关任务:利用多线程相关知识控制三个线程,依照先后顺序顺序输出. 相关知识(略) 编程要求 请仔细阅读右侧代码,在 Begin-End 区域内进行代码补充,使线程依照先后顺 ...
- 头歌Educoder——Java高级特性 - JDBC(上)
第1关:JDBC连接数据库 任务描述 本关任务:使用jdbc连接数据库并完成创建数据库和创建表的操作. 相关知识 JDBC API提供以下接口和类: DriverManager:此类管理数据库驱动程序 ...
- Educoder–Java高级特性(第一章)- IO流【笔记+参考代码】
Educoder–Java高级特性(第一章)- IO流[笔记+参考代码] 第一关 1.下列关于字节和字符的说法正确的是(BC) A.字节 = 字符 + 编码 B.字符 = 字节 + 编码 C.字节 = ...
- Educoder–Java高级特性(第二章)- 集合框架【笔记+参考代码】
Educoder–Java高级特性(第二章)- 集合框架[笔记+参考代码] 第一关 编程要求 请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,创建ArrayList集 ...
- Educoder -Java高级特性 - IO流 4关
Educoder -Java高级特性 - IO流 第一关 第二关:本关任务:使用输入输出流读写文件. 请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体任务如下: ...
- 【Java高级】多线程基础
文章目录 1.jvm启动时的线程 2. 实现线程 2.1实现线程的第一种方式 2.2 实现线程第二种方法 3.线程生命周期 4.线程名字 5.线程的sleep 6.终止线程的睡眠 7.合理终止一个线程 ...
最新文章
- ubuntu64位 oracle 11g,64位Ubuntu安装Oracle11G
- 你和阿里资深架构师之间,差的不仅仅是年龄(进阶必看)
- [渝粤教育] 西南科技大学 工程测量 在线考试复习资料
- 2018第二届河北省大学生程序设计竞赛题解
- 互联网晚报 | 3月26日 星期六 |​ 竞拍规则优化,部分城市土地市场有所回暖;​​武汉房贷利率下调...
- linuc和python常用命令是一样的么_linuc和python常用命令是一样的么_python教程3--《linux常用命令》...
- 伺服电机回原点的原理_西门子V90伺服电机绝对值编码器回原点常用方法
- 2017级C语言大作业 - 合金弹头
- 嵌入式linux蓝牙通讯,开发板蓝牙通信问题,有这方面经验的请进
- Oracle truncate table 与 delete tabel的区别
- Ubuntu 16.04 解决RTL8111/8168/8411网卡有线连接网速慢的问题
- 【转】为什么你的硬盘容易坏?因为它转得实在是太快了
- 步进电机基础(2.1)- 定子相数的分类、结构、原理
- 一维数组——折半查找法
- 【学习笔记】NIM游戏与SG函数初探
- 为什么资源隔离对HTAP至关重要?
- 页面设计之论坛网页设计欣赏(前端)
- 未定义的标识符:IplImage
- 人工神经网络研究综述,人工神经网络分析方法
- Android 增量更新实现