多线程学习-坏人

2024-02-21 16:08
文章标签 学习 多线程 坏人

本文主要是介绍多线程学习-坏人,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

学习原:来自哔哩哔哩:狂神

1.学习 Runnable

2.问题

1.问题1

java代码:

package com.sunweihao.example;
//多个线程同时操作一个对象
//拍电影的例子,先到先拍片
public class TestThread4 implements Runnable {//有十部电影private int ticketNums=10;@Overridepublic void run() {while (true){if (ticketNums<=0){break;}try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"---->拍了第"+ticketNums--+"剧");}}public static void main(String[] args) {TestThread4 ticket=new TestThread4();new Thread(ticket,"颇多野老师").start();new Thread(ticket,"苍井空老湿").start();new Thread(ticket,"老司机").start();}
}

打印结果:
在这里插入图片描述

问题分析:
在这里插入图片描述

解决办法:

加锁

package com.sunweihao.example;
//多个线程同时操作一个对象
//拍电影的例子
public class TestThread4Improve implements Runnable {//有十部电影private int ticketNums=10;@Overridepublic void run() {play();}private synchronized void  play() {while (true){if (ticketNums<=0){break;}try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"---->拍了第"+ticketNums--+"剧");}}public static void main(String[] args) {TestThread4Improve ticket=new TestThread4Improve();new Thread(ticket,"颇多野老师").start();new Thread(ticket,"苍井空老湿").start();new Thread(ticket,"老司机").start();}
}

结果:
在这里插入图片描述

2.Thread下载

步骤:

1.导包
在这里插入图片描述
2.代码:下载文件

package com.sunweihao.example;import org.apache.commons.io.FileUtils;import java.io.File;
import java.io.IOException;
import java.net.URL;public class TestThread2 extends Thread {private String url;private String name;public TestThread2(String url,String name){this.url=url;this.name=name;//hhh}@Overridepublic void run() {WebDownloader webDownloader=new WebDownloader();webDownloader.downloader(url,name);System.out.println("下载了文件名为:"+name);}public static void main(String[] args) {TestThread2 testThread1=new TestThread2("https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=3620297292,2452146774&fm=26&gp=0.jpg","苍井空老师");TestThread2 testThread2=new TestThread2("https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=3620297292,2452146774&fm=26&gp=0.jpg","颇多野老师");TestThread2 testThread3=new TestThread2("https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=3620297292,2452146774&fm=26&gp=0.jpg","孙伟豪老师");testThread1.start();testThread2.start();testThread3.start();}
}
class WebDownloader{//下载方法public void downloader(String url,String name){try {FileUtils.copyURLToFile(new URL(url),new File(name));} catch (IOException e) {e.printStackTrace();System.out.println("IO异常,download方法出现错误");}}
}

3.生产消费者模式

展示图

在这里插入图片描述

1.有个共同的操作

这里共同操作是TV
生产者:演员

class Player extends Thread{TV tv;public Player(TV tv){this.tv=tv;}@Overridepublic void run() {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}for (int i = 0; i < 20; i++) {if (i%2==0) {this.tv.play("快乐大本营播放中");}else {this.tv.play("抖音:记录美好生活");}}}
}

消费者:观众

class Watcher extends Thread{TV tv;public Watcher(TV tv){this.tv=tv;}@Overridepublic void run() {for (int i = 0; i < 20; i++) {tv.watch();}}
}

他们共同看TV

class TV{//演员表演,观众等待T//观众观看,演员等待FString voice;//表演的节目boolean flag=true;//表演public synchronized void play(String voice){try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}//休眠if (!flag) {try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}//等待}System.out.println("演员表演了:"+voice);//通知观众观看this.notifyAll();//通知唤醒this.voice=voice;this.flag=!this.flag;}//观看public synchronized void watch(){try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}//休眠if (flag) {try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}//等待}System.out.println("观看了:"+voice);//通知演员表演this.notifyAll();this.flag=!this.flag;}
}

关键代码介绍

1.this.wait()会导致休眠
2.this.notifyAll();//通知其他线程唤醒
3.notify();//通知一条线程唤醒

全部代码

package com.sunweihao.gaoji;
//测试生产者消费者问题2,信号灯法,标志位解决
public class TestPc2 {public static void main(String[] args) throws Exception {TV tv=new TV();new Player(tv).start();new Watcher(tv).start();}
}
//生产者-演员
class Player extends Thread{TV tv;public Player(TV tv){this.tv=tv;}@Overridepublic void run() {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}for (int i = 0; i < 20; i++) {if (i%2==0) {this.tv.play("快乐大本营播放中");}else {this.tv.play("抖音:记录美好生活");}}}
}
//消费者-观众
class Watcher extends Thread{TV tv;public Watcher(TV tv){this.tv=tv;}@Overridepublic void run() {for (int i = 0; i < 20; i++) {tv.watch();}}
}
//产品-节目
class TV{//演员表演,观众等待T//观众观看,演员等待FString voice;//表演的节目boolean flag=true;//表演public synchronized void play(String voice){try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}//休眠if (!flag) {try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}//等待}System.out.println("演员表演了:"+voice);//通知观众观看this.notifyAll();//通知唤醒this.voice=voice;this.flag=!this.flag;}//观看public synchronized void watch(){try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}//休眠if (flag) {try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}//等待}System.out.println("观看了:"+voice);//通知演员表演this.notifyAll();this.flag=!this.flag;}
}

这篇关于多线程学习-坏人的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/732330

相关文章

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Python多线程应用中的卡死问题优化方案指南

《Python多线程应用中的卡死问题优化方案指南》在利用Python语言开发某查询软件时,遇到了点击搜索按钮后软件卡死的问题,本文将简单分析一下出现的原因以及对应的优化方案,希望对大家有所帮助... 目录问题描述优化方案1. 网络请求优化2. 多线程架构优化3. 全局异常处理4. 配置管理优化优化效果1.

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

Qt中实现多线程导出数据功能的四种方式小结

《Qt中实现多线程导出数据功能的四种方式小结》在以往的项目开发中,在很多地方用到了多线程,本文将记录下在Qt开发中用到的多线程技术实现方法,以导出指定范围的数字到txt文件为例,展示多线程不同的实现方... 目录前言导出文件的示例工具类QThreadQObject的moveToThread方法实现多线程QC

RabbitMQ消费端单线程与多线程案例讲解

《RabbitMQ消费端单线程与多线程案例讲解》文章解析RabbitMQ消费端单线程与多线程处理机制,说明concurrency控制消费者数量,max-concurrency控制最大线程数,prefe... 目录 一、基础概念详细解释:举个例子:✅ 单消费者 + 单线程消费❌ 单消费者 + 多线程消费❌ 多

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio