0

0

Thread、线程创建的实例教程

零下一度

零下一度

发布时间:2017-06-25 09:35:59

|

1787人浏览过

|

来源于php中文网

原创

主线程:执行主方法的线程,就叫做主线程

单线程程序:程序从mani开始从上到下依次运行

 程序从main方法开始运行,jvm运行main方法,会找操作系统
 开辟一条通向cpu的执行路径,cpu可以通过这条路径来执行main方法
 这条路径有一个名字叫主(main)线程

创建线程方式一继承thread类
 实现步骤:
1.创建thread类的子类
2.重写thread类中的run方法,设置线程的任务
3.创建thread类的子类对象
4.调用thread类中的start方法开启一个新的线程,执行run方法
使该线程开始执行;java 虚拟机调用该线程的 run 方法。
结果是两个线程并发地运行;当前线程(main线程)和另一个线程(执行 run 方法的线程)。
多次启动一个线程是非法的。特别是当线程已经结束执行后,不能再重新启动。

打印的结果出现了随机性:
开启两个线程,对于cpu就选择权利
喜欢谁,就执行谁,所以就出现了随机性结果

 1 public class MyThread extends Thread{ 2     /* 3      * 2.重写Thread类中的run方法,设置线程的任务 4      * 开启这个线程要干什么事情 5      */ 6     @Override 7     public void run() { 8         for (int i = 0; i < 50; i++) { 9             System.out.println("run..."+i);10         }11     }12 }13     public static void main(String[] args) {14         //3.创建Thread类的子类对象15         MyThread mt = new MyThread();16         //mt.run();//不会开启线程,还是单线程程序17         //4.调用Thread类中的start方法开启一个新的线程,执行run方法18         mt.start();19         20         new MyThread().start();21         22         for (int i = 0; i < 50; i++) {23             System.out.println("main..."+i);24         }25     }

线程的名称:
主线程:"main"
开启的其它线程的名称:"Thread-0","Thread-1"....

获取线程的名称
1.Thread类中的方法getName
String getName() 返回该线程的名称。
2.Thread类中的静态方法,获取当前正在执行的线程
static Thread currentThread() 返回对当前正在执行的线程对象的引用。
设置线程的名称:
1.Thread类中的方法setName(String name)
void setName(String name) 改变线程名称,使之与参数 name 相同。
2.子类添加带参构造,调用父类Thread类的带参构造方法,传递线程的名称,让父类给线程起名字(让父亲给儿子起名字)
Thread(String name) 分配新的 Thread 对象。


创建线程方式—实现Runnable接口

实现步骤:
1.创建Runnable接口的实现类
2.重写Runnable接口中的run方法,设置线程任务
3.创建Runnable接口的实现类对象
4.创建Thread类对象,构造方法中传入Runnable接口的实现类
Thread(Runnable target) 分配新的 Thread 对象。
5.调用Thread类中的方法start,开启线程执行run方法


实现Runnable的好处
1.避免了类继承Thread类之后,无法继承其它的类(单继承的局限性)
2.把设置线程任务,和开启线程进行解耦,增强了扩展性
实现类的作用:就是设置线程任务
Thread类的作用:开启线程
好处:传递不同的实现类,实现类重写的方法不一样,可以调用不同的方法

线程的匿名内部类使用

   匿名:没有名字
   内部类:写在其他类内部的类(成员位置:成员内部类,局部位置(方法中):局部内部类)

   匿名内部类的格式:
    new 父类/接口(){
    重写父类/接口中的方法;
    };

   多线程的父类:
    Thread
    Runnable

1  new Thread(){2             //重写run方法,设置线程任务3             @Override4             public void run() {5                 for (int i = 0; i < 20; i++) {6                     System.out.println(Thread.currentThread().getName()+":"+i);7                 }8             }9         }

以上一堆代码就是一个创建子类重写父类方法的过程
相当于: new MyThread().start();

台讯电子企业网站管理系统  简繁全功能版
台讯电子企业网站管理系统 简繁全功能版

超级适合代理建设企业站点的企业源码,超方面实用!程序说明: 1.特色:简繁中文切换、产品展示系统、新闻发布系统、会员管理系统、留言本计数器、网站信息统计、强大后台操作 功能等; 2.页面包括:首页、企业介绍、滚动公告通知发布系统、企业新闻系统、产品展示系统、企业案例发布展示系 统、企业招聘信息发布系统、信息资源下载系统、在线定单系统、在线客服系统、在线留言本系统、网站调查投票系统、友情连接系统、会

下载

程序出现了线程安全问题:卖了重复的票和不存在的票

解决方案:
第一种方式:可以使用同步代码块

synchronized(锁对象){
产生安全问题的代码;
访问了共享数据的代码;
}

注意:
必须要保证多个线程使用的是同一个锁对象
//在成员位置上创建一个锁对象(保证唯一)

 1 Object obj = new Object(); 2      3     @Override 4     public void run() { 5         //让卖票重复执行 6         while(true){ 7          8              * 同步代码块 9              * 程序会频繁的判断锁,获取锁,释放锁,所以会降低速度10              11             synchronized (obj) {12                 if(ticket>0){13                     //为了提高安全问题的概率,让程序睡眠14                     try {15                         Thread.sleep(10);16                     } catch (InterruptedException e) {17                         e.printStackTrace();18                     }19                     //卖票ticket--20                     System.out.println(Thread.currentThread().getName()+"...卖第"+ticket--+"张票");21                 }22             }23         }24     }

程序出现了线程安全问题:卖了重复的票和不存在的票

   解决方案:
    第二种方式:同步方法

   使用步骤:
    1.把可能出现安全问题的代码抽取到一个方法中
    2.把方法增加一个关键字synchronized
    修饰符 synchronized 返回值类型 方法名(参数){
    可能出现安全问题的代码;
    访问了共享数据的代码;
    }

   同步方法使用的锁对象是什么?
   使用的就是本类对象new RunnableImpl()-->叫this

   静态的同步方法,使用时什么锁对象?
   使用的是本类对象的class属性(反射)
   RunnableImpl.class

 1 *@Override 2     public void run() { 3         //让卖票重复执行 4         while(true){ 5             payTicket2(); 6         } 7     } 8      9     10      * 静态的同步方法11      12     public static synchronized void payTicket2(){13         synchronized (RunnableImpl.class) {14             if(ticket>0){15                 //为了提高安全问题的概率,让程序睡眠16                 try {17                     Thread.sleep(10);18                 } catch (InterruptedException e) {19                     e.printStackTrace();20                 }21                 //卖票ticket--22                 System.out.println(Thread.currentThread().getName()+"...卖第"+ticket--+"张票");23             }24         }25     }26     27     28     29      * 抽取出一个同步方法30      * 快捷键:alt+shift+m31      32     public ynchronized void payTicket1() {33         synchronized (this) {34             //System.out.println(this);//cn.itcsat.demo10.RunnableImpl@6706435             if(ticket>0){36                 //为了提高安全问题的概率,让程序睡眠37                 try {38                     Thread.sleep(10);39                 } catch (InterruptedException e) {40                     e.printStackTrace();41                 }42                 //卖票ticket--43                 System.out.println(Thread.currentThread().getName()+"...卖第"+ticket--+"张票");44             }45         }46     }

程序出现了线程安全问题:卖了重复的票和不存在的票
*
* 解决方案:
* 第三种方式:使用Lock接口,JDK1.5之后出现的
*
* java.util.concurrent.locks.Lock接口
* 方法:
* void lock() 获取锁。
* void unlock() 释放锁。  
*  接口的实现类:ReentrantLock
*  
* 实现步骤:
* 1.在成员位置创建一个Lock接口的实现类对象ReentrantLock
* 2.在可能出现线程安全问题的代码前,调用lock方法获取锁
* 3.在可能出现线程安全问题的代码后,调用unlock方法释放锁
*
*1.在成员位置创建一个Lock接口的实现类对象ReentrantLock
Lock l = new ReentrantLock();

 1 @Override 2     public void run() { 3         //让卖票重复执行 4         while(true){ 5             //2.在可能出现线程安全问题的代码前,调用lock方法获取锁 6             l.lock(); 7                 if(ticket>0){ 8                     //为了提高安全问题的概率,让程序睡眠 9                     try {10                         Thread.sleep(10);11                         //卖票ticket--12                         System.out.println(Thread.currentThread().getName()+"...卖第"+ticket--+"张票");13                     } catch (InterruptedException e) {14                         e.printStackTrace();15                     }finally {16                         //3.在可能出现线程安全问题的代码后,调用unlock方法释放锁17                         l.unlock();    
18                     }19                 }20         }

 

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

48

2026.02.28

Golang 工程化架构设计:可维护与可演进系统构建
Golang 工程化架构设计:可维护与可演进系统构建

Go语言工程化架构设计专注于构建高可维护性、可演进的企业级系统。本专题深入探讨Go项目的目录结构设计、模块划分、依赖管理等核心架构原则,涵盖微服务架构、领域驱动设计(DDD)在Go中的实践应用。通过实战案例解析接口抽象、错误处理、配置管理、日志监控等关键工程化技术,帮助开发者掌握构建稳定、可扩展Go应用的最佳实践方法。

44

2026.02.28

Golang 性能分析与运行时机制:构建高性能程序
Golang 性能分析与运行时机制:构建高性能程序

Go语言以其高效的并发模型和优异的性能表现广泛应用于高并发、高性能场景。其运行时机制包括 Goroutine 调度、内存管理、垃圾回收等方面,深入理解这些机制有助于编写更高效稳定的程序。本专题将系统讲解 Golang 的性能分析工具使用、常见性能瓶颈定位及优化策略,并结合实际案例剖析 Go 程序的运行时行为,帮助开发者掌握构建高性能应用的关键技能。

37

2026.02.28

Golang 并发编程模型与工程实践:从语言特性到系统性能
Golang 并发编程模型与工程实践:从语言特性到系统性能

本专题系统讲解 Golang 并发编程模型,从语言级特性出发,深入理解 goroutine、channel 与调度机制。结合工程实践,分析并发设计模式、性能瓶颈与资源控制策略,帮助将并发能力有效转化为稳定、可扩展的系统性能优势。

22

2026.02.27

Golang 高级特性与最佳实践:提升代码艺术
Golang 高级特性与最佳实践:提升代码艺术

本专题深入剖析 Golang 的高级特性与工程级最佳实践,涵盖并发模型、内存管理、接口设计与错误处理策略。通过真实场景与代码对比,引导从“可运行”走向“高质量”,帮助构建高性能、可扩展、易维护的优雅 Go 代码体系。

19

2026.02.27

Golang 测试与调试专题:确保代码可靠性
Golang 测试与调试专题:确保代码可靠性

本专题聚焦 Golang 的测试与调试体系,系统讲解单元测试、表驱动测试、基准测试与覆盖率分析方法,并深入剖析调试工具与常见问题定位思路。通过实践示例,引导建立可验证、可回归的工程习惯,从而持续提升代码可靠性与可维护性。

3

2026.02.27

漫蛙app官网链接入口
漫蛙app官网链接入口

漫蛙App官网提供多条稳定入口,包括 https://manwa.me、https

268

2026.02.27

deepseek在线提问
deepseek在线提问

本合集汇总了DeepSeek在线提问技巧与免登录使用入口,助你快速上手AI对话、写作、分析等功能。阅读专题下面的文章了解更多详细内容。

51

2026.02.27

AO3官网直接进入
AO3官网直接进入

AO3官网最新入口合集,汇总2026年可用官方及镜像链接,助你快速稳定访问Archive of Our Own平台。阅读专题下面的文章了解更多详细内容。

430

2026.02.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Vue 教程
Vue 教程

共42课时 | 9.1万人学习

Django 教程
Django 教程

共28课时 | 4.7万人学习

React 教程
React 教程

共58课时 | 5.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号