没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
一、创建和启动线程
(1)概述
(2)方式1:继承Thread类
1、使用步骤
2、举例
2.1 案例1
2.2 案例2
2.3 案例3
3、两个问题
3.1 问题1
3.2 问题2
4、代码及总结
二、练习
(1)方式一
(2)方式二
一、创建和启动线程
(1)概述
Java语言的JVM允许程序运行多个线程,使用 java.lang.Thread 类代表线程,所有的线程对
象都必须是Thread类或其子类的实例。 (创建一个线程可以理解为创建这个类的一个对象,
一个对象对应一个线程)
Thread类的特性
每个线程都是通过某个特定Thread对象的run()方法来完成操作的,因此把run()方法
体称为 线程执行体 。
通过该Thread对象的start()方法来启动这个线程,而非直接调用run()
要想实现多线程,必须在主线程中创建新的线程对象。
(2)方式1:继承Thread类
1、使用步骤
Java通过继承Thread类来创建并启动多线程的步骤如下:
1. 定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成
的任务
2. 创建Thread子类的实例,即创建了线程对象
3. 调用线程对象的start()方法来启动该线程
如下:
举例代码如下:
测试类:
package com.atguigu.thread;
//自定义线程类
public class MyThread extends Thread {
//定义指定线程名称的构造方法
public MyThread(String name) {
//调用父类的String参数的构造方法,指定线程的名称
super(name);
}
/**
* 重写run方法,完成该线程执行的逻辑
*/
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(getName()+":正在执行!"+i);
}
}
}
package com.atguigu.thread;
public class TestMyThread {
public static void main(String[] args) {
//创建自定义线程对象1
MyThread mt1 = new MyThread("子线程1");
//开启子线程1
注意:
1. 如果自己手动调用run()方法,那么就只是普通方法,没有启动多线程模式。
2. run()方法由JVM调用,什么时候调用,执行的过程控制都有操作系统的CPU调度决定。
3. 想要启动多线程,必须调用start方法。
4. 一个线程对象只能调用一次start()方法启动,如果重复调用了,则将抛出以上的异常
“ IllegalThreadStateException ”。
mt1.start();
//创建自定义线程对象2
MyThread mt2 = new MyThread("子线程2");
//开启子线程2
mt2.start();
//在主方法中执行for循环
for (int i = 0; i < 10; i++) {
System.out.println("main线程!"+i);
}
}
}
2、举例
2.1 案例1
🌋
描述:创建一个分线程1,用于遍历100以内的偶数。
🚗
分析
<1> 创建一个继承于Thread类的子类。
<2> 重写Thread类的run() --->将此线程要执行的操作,声明在此方法体中。
<3> 创建当前Thread的子类的对象。
public class EvenNumberTest {
}
//1.创建一个继承于Thread类的子类
class PrintNumber extends Thread{
}
public class EvenNumberTest {
}
//1.创建一个继承于Thread类的子类
class PrintNumber extends Thread{
//2.重写Thread类的run() --->将此线程要执行的操作,声明在此方法体中
@Override
public void run() {
for (int i = 1; i <= 100; i++) {
if(i%2==0){
System.out.println(i);
}
}
}
}
public class EvenNumberTest {
public static void main(String[] args) {
//3.创建当前Thread的子类的对象
PrintNumber t1=new PrintNumber();
}
}
<4>通过对象调用 start() : 1.启动线程 2.调用当前线程的 run() 。
当前 PrintNumber 类里面没有重写start方法,这就意味着调用的是父类 Thread 里面的start方法。
这个 start() 方法有什么作用呢?
所以start方法有两个作用:1.启动线程 2.调用当前线程的 run() 方法。
在刚才的代码中, t1 调用 start() 方法,这里的 start() 方法是父类中的。
此时调用了当前线程的 run() 方法,这个方法在 Thread 类里面定义的,并且在子类 PrintNumber
里面被重写了,所以父类中的方法被覆盖了,此时调用的就是子类的run()方法。
整体来看,调用 t1.start() ,子类中的 run() 方法就被执行了。
🌱
整体代码
public class EvenNumberTest {
public static void main(String[] args) {
//3.创建当前Thread的子类的对象
PrintNumber t1=new PrintNumber();
//4.通过对象调用start(): 1.启动线程 2.调用当前线程的run()
t1.start();
}
}
//1.创建一个继承于Thread类的子类
class PrintNumber extends Thread{
//2.重写Thread类的run() --->将此线程要执行的操作,声明在此方法体中
@Override
public void run() {
for (int i = 1; i <= 100; i++) {
if(i%2==0){
System.out.println(i);
}
}
}
}
剩余23页未读,继续阅读
资源评论
雨翼轻尘
- 粉丝: 6w+
- 资源: 130
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 上市公司-人工智能的采纳程度面板数据(2003-2021年).xlsx
- 第5章spring-mvc请求映射处理
- 2023-04-06-项目笔记 - 第一百十六阶段 - 4.4.2.114全局变量的作用域-114 -2024.04.27
- app-release.apk.1
- soap json 等系列化方式
- c++的五子棋代码,在vs6.0上完美运行
- 基于Javaee的影视创作论坛的设计与实现.rar
- Python导出Mysql数据字典(部分表或全表)
- Java工具类实现输入一个路径,强创建路径、并且鉴权目标路径是否具备修改权限,用于增强程序的健壮性与稳定性,快速开发!
- 资源【STM32+HAL】三轴按键PS2摇杆
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功