热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:多线程:多线程的应用(网图下载模拟售票龟兔赛跑)

本文由编程笔记#小编为大家整理,主要介绍了多线程:多线程的应用(网图下载模拟售票龟兔赛跑)相关的知识,希望对你有一定的参考价值。1、网图下载(继承Thread类)
本文由编程笔记#小编为大家整理,主要介绍了多线程:多线程的应用(网图下载模拟售票龟兔赛跑)相关的知识,希望对你有一定的参考价值。


1、网图下载(继承Thread类)

(1)导包

技术图片

 

(2)创建WebDownloader 类,书写下载图片的方法:


public class WebDownloader {
public void downloader(String url,String name){
try {
FileUtils.copyURLToFile(
new URL(url),new File(name));
}
catch (IOException e) {
e.printStackTrace();
}
}
}

(3)创建TestThread 类,继承Thread类,用于实现多线程:


public class TestThread extends Thread{
private String url;//网络图片地址
private String name;//保存的文件名
public TestThread(String url, String name) {
this.url = url;
this.name = name;
}
public void run(){
WebDownloader webDownloader
=new WebDownloader();
webDownloader.downloader(url,name);
System.out.println(
"下载了:"+name);
}
public static void main(String[] args) {
TestThread testThread1
=new TestThread("https://img2018.cnblogs.com/blog/1392562/201908/1392562-20190817173332328-1651495806.png","1.pnj");
TestThread testThread2
=new TestThread("https://img2020.cnblogs.com/blog/1392562/202005/1392562-20200516214429116-874432537.png","2.png");
TestThread testThread3
=new TestThread("https://img2018.cnblogs.com/blog/1392562/201908/1392562-20190817173332328-1651495806.png","3.png");
testThread1.start();
testThread2.start();
testThread3.start();
}
}

继承Thread类,书写run方法,在该方法内部调用图片下载的方法,最后,创建线程对象,并利用对象调用start方法开启三个线程

(4)测试:


下载了:2.png
下载了:
1.pnj
下载了:
3.png

技术图片

 

2、模拟售票

(1)代码:


public class TestThread implements Runnable{
private int ticketsNums=10;
@Override
public void run() {
while(true){
if(ticketsNums<=0){
break;
}
try {
Thread.sleep(
200);//延时200ms
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread()
+"拿到了"+ticketsNums--+"张票");
}
}
public static void main(String[] args) {
TestThread testThread
=new TestThread();
new Thread(testThread,"zhai").start();
new Thread(testThread,"zhang").start();
new Thread(testThread,"liu").start();
}
}

调用sleep方法的目的是避免第一个线程长时间的占用,给后面两个线程机会

(2)测试:


Thread[liu,5,main]拿到了10张票
Thread[zhang,
5,main]拿到了9张票
Thread[zhai,
5,main]拿到了8张票
Thread[liu,
5,main]拿到了7张票
Thread[zhang,
5,main]拿到了6张票
Thread[zhai,
5,main]拿到了5张票
Thread[liu,
5,main]拿到了4张票
Thread[zhang,
5,main]拿到了3张票
Thread[zhai,
5,main]拿到了2张票
Thread[zhang,
5,main]拿到了1张票
Thread[liu,
5,main]拿到了1张票
Thread[zhai,
5,main]拿到了0张票

可以看到有的票出现了两次,这是因为在多个线程共享同一个数据的时候存在线程安全的问题,当对存在安全隐患的数据加锁后,会导致程序的性能降低,所以,如果是多个线程操作同一个数据,一定要选择线程安全的方法,如果不是,可以选择线程不安全的方式来处理问题(多线程(线程间的数据共享、线程安全、线程通信)

 

3、龟兔赛跑

(1)代码:


public class Race implements Runnable {
//胜利者
private static String winner;
@Override
public void run() {
for(int i=0;i<=100;i++){
//模拟兔子休息
if(Thread.currentThread().getName().equals("兔子")&&i%20==0){
try {
Thread.sleep(
1);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
//判断比赛是否结束
boolean flag=gameOver(i);
//如果比赛结束了,就停止程序
if(flag){
break;
}
System.out.println(Thread.currentThread().getName()
+"跑了"+i+"步");
}
}
//判断是否完成比赛
private boolean gameOver(int steps){
if(winner!=null){
return true;
}{
if(steps>=100){
winner
=Thread.currentThread().getName();
System.out.println(
"winner is"+winner);
return true;
}
}
return false;
}
public static void main(String[] args) {
Race race
=new Race();
new Thread(race,"兔子").start();
new Thread(race,"乌龟").start();
}
}

(2)测试:


乌龟跑了0步
乌龟跑了1步
乌龟跑了2步
乌龟跑了3步
乌龟跑了4步
乌龟跑了5步
乌龟跑了6步
乌龟跑了7步
乌龟跑了8步
乌龟跑了9步
乌龟跑了10步
乌龟跑了11步
乌龟跑了12步
乌龟跑了13步
乌龟跑了14步
乌龟跑了15步
乌龟跑了16步
乌龟跑了17步
乌龟跑了18步
乌龟跑了19步
乌龟跑了20步
乌龟跑了21步
乌龟跑了22步
乌龟跑了23步
乌龟跑了24步
乌龟跑了25步
乌龟跑了26步
乌龟跑了27步
乌龟跑了28步
乌龟跑了29步
乌龟跑了30步
乌龟跑了31步
乌龟跑了32步
乌龟跑了33步
乌龟跑了34步
乌龟跑了35步
乌龟跑了36步
乌龟跑了37步
乌龟跑了38步
乌龟跑了39步
乌龟跑了40步
乌龟跑了41步
乌龟跑了42步
乌龟跑了43步
乌龟跑了44步
乌龟跑了45步
乌龟跑了46步
乌龟跑了47步
乌龟跑了48步
乌龟跑了49步
乌龟跑了50步
乌龟跑了51步
乌龟跑了52步
乌龟跑了53步
乌龟跑了54步
乌龟跑了55步
乌龟跑了56步
乌龟跑了57步
乌龟跑了58步
乌龟跑了59步
乌龟跑了60步
兔子跑了0步
兔子跑了1步
兔子跑了2步
兔子跑了3步
兔子跑了4步
兔子跑了5步
兔子跑了6步
兔子跑了7步
兔子跑了8步
兔子跑了9步
兔子跑了10步
兔子跑了11步
兔子跑了12步
兔子跑了13步
兔子跑了14步
兔子跑了15步
兔子跑了16步
兔子跑了17步
兔子跑了18步
兔子跑了19步
乌龟跑了61步
乌龟跑了62步
乌龟跑了63步
乌龟跑了64步
乌龟跑了65步
乌龟跑了66步
乌龟跑了67步
乌龟跑了68步
乌龟跑了69步
兔子跑了20步
兔子跑了21步
兔子跑了22步
兔子跑了23步
兔子跑了24步
兔子跑了25步
兔子跑了26步
兔子跑了27步
兔子跑了28步
兔子跑了29步
兔子跑了30步
兔子跑了31步
兔子跑了32步
兔子跑了33步
兔子跑了34步
兔子跑了35步
兔子跑了36步
兔子跑了37步
兔子跑了38步
兔子跑了39步
乌龟跑了70步
乌龟跑了71步
乌龟跑了72步
乌龟跑了73步
乌龟跑了74步
乌龟跑了75步
乌龟跑了76步
乌龟跑了77步
乌龟跑了78步
乌龟跑了79步
乌龟跑了80步
乌龟跑了81步
乌龟跑了82步
乌龟跑了83步
乌龟跑了84步
乌龟跑了85步
乌龟跑了86步
乌龟跑了87步
乌龟跑了88步
乌龟跑了89步
乌龟跑了90步
乌龟跑了91步
乌龟跑了92步
乌龟跑了93步
乌龟跑了94步
乌龟跑了95步
乌龟跑了96步
乌龟跑了97步
乌龟跑了98步
乌龟跑了99步
winner is乌龟

此例子中,兔子线程和乌龟线程没有共享数据,也就是说他们的步数是相互独立的。当执行兔子线程的时候调用sleep方法,给乌龟线程更多的时间。率先执行到100步的时候程序停止,获取线程的名字。

 


推荐阅读
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 本文探讨了 Objective-C 中的一些重要语法特性,包括 goto 语句、块(block)的使用、访问修饰符以及属性管理等。通过实例代码和详细解释,帮助开发者更好地理解和应用这些特性。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文介绍了如何使用 Spring Boot DevTools 实现应用程序在开发过程中自动重启。这一特性显著提高了开发效率,特别是在集成开发环境(IDE)中工作时,能够提供快速的反馈循环。默认情况下,DevTools 会监控类路径上的文件变化,并根据需要触发应用重启。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
author-avatar
手机用户2502930273
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有