关于线程的小应用(动态播放图片)以及通过小应用得出线程的一个好处

简介: 关于线程的小应用(动态播放图片)以及通过小应用得出线程的一个好处

关于线程的小应用(动态播放图片)以及通过小应用得出线程的一个好处

代码:

package com.xuetang9.kenny;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class MyThreadDemo extends JFrame {
    // 控件为图片
    private JLabel lblImageIcon = new JLabel("图标控件在这里");
    public MyThreadDemo() {
        // 设置大小
        setSize(650, 633);
        // 居中显示
        setLocationRelativeTo(null);
        // 设置可见性
        setVisible(true);
        // 设置关闭退出
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        // 加载图片
//        loadImage();
        // 添加组件
        initCompents();
    }
    /**
     * 封装初始化组件
     */
    private void initCompents() {
        // 将内容面板设置无布局
        JPanel panelContent = (JPanel) getContentPane();
        panelContent.setLayout(null);
        // 设置图片控件的边界
        lblImageIcon.setBounds(0, 80, 650, 533);
        // 添加图标,src\\com\\xuetang9\\kenny\\photos\\2.jpeg 是图片的路径
        lblImageIcon.setIcon(new ImageIcon("src\\com\\xuetang9\\kenny\\photos\\2.jpeg"));
        // 面板内容添加图片控件
        panelContent.add(lblImageIcon);
    }
    public static void main(String[] args) {
        new MyThreadDemo();
    }
}

运行结果:

1.png

 

 

通过运行结果,可以看到此时打开了一张图片哈,这时候,一张图片怎么够看呢?

 

我们想要连续播放猫猫图片?怎么做呢?----线程的作用来了:

 

先上代码,再分析代码:

package com.xuetang9.kenny;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class MyThreadDemo extends JFrame {
    // 图片数组
    private ImageIcon[] images = new ImageIcon[6];    //长度是6 ,是因为我现在才找了六张猫咪的图片哈哈
    // 控件为图片
    private JLabel lblImageIcon = new JLabel("图标控件在这里");
    public MyThreadDemo() {
        // 设置大小
        setSize(650, 633);
        // 居中显示
        setLocationRelativeTo(null);
        // 设置可见性
        setVisible(true);
        // 设置关闭退出
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        // 加载图片
        loadImage();
        // 添加组件
        initCompents();
    }
    // 加载图片,实际就是给图片数组赋值
    private void loadImage() {
        for (int i = 0; i < images.length; i++) {
            images[i] = new ImageIcon("src\\com\\xuetang9\\kenny\\photos\\" + (i + 1) + ".jpeg");
        }
    }
    /**
     * 封装初始化组件
     */
    private void initCompents() {
        // 将内容面板设置无布局
        JPanel panelContent = (JPanel) getContentPane();
        panelContent.setLayout(null);
        // 设置图片控件的边界
        lblImageIcon.setBounds(0, 80, 650, 533);
        // 添加图标,src\\com\\xuetang9\\kenny\\photos\\2.jpeg 是图片的路径
//        lblImageIcon.setIcon(new ImageIcon("src\\com\\xuetang9\\kenny\\photos\\2.jpeg"));\
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                int i = 0; 
                while (true) {
                    try {
                        if(i < 0 || i > 5) {    //因为图片数组的长度是6,数组下标越界的处理
                            i = 0;
                        }
                        Thread.sleep(400);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //添加图标
                    lblImageIcon.setIcon(images[i]);
                    i++;
                }
            }
        });
        thread.start();
        // 面板内容添加图片控件
        panelContent.add(lblImageIcon);
    }
    public static void main(String[] args) {
        new MyThreadDemo();
    }
}

 

运行结果:六只猫咪图片动态播放❤❤自己代码加上图片自己玩哈哈哈哈

 

分析代码:

代码思路:(在原代码基础上加了什么使得图片得到了动态播放)

(1)我们加了一个图片数组,并且为图片数组的元素赋值“图片值--new ImageIcon(路径);  

  文章第一处代码语句是:  new ImageIcon("src\\com\\xuetang9\\kenny\\photos\\2.jpeg");

    文章第二处代码语句是: images[i] = new ImageIcon("src\\com\\xuetang9\\kenny\\photos\\" + (i + 1) + ".jpeg");

(2)我们通过线程,每隔400毫秒,图片控件(代码中是 lblImageIcon)添加图标.setIcon(ImageIcon);     

   文章第一处代码语句是:lblImageIcon.setIcon(new ImageIcon("src\\com\\xuetang9\\kenny\\photos\\2.jpeg"));  

   文章第二处代码语句是lblImageIcon.setIcon(images[i]);   此时的images[i]数组的元素赋值“图片值”。

(3)线程启动 ,调用线程对象的start() 方法   文章代码语句是: thread.start();

(4)面板内容添加进图标控件  文章代码语句是: panelContent.add(lblImageIcon);

 

为啥动态播放图片,要通过线程,那就要考虑线程做了什么事情:

首先,如果是播放一张图片的情况下,不需要线程来帮忙,直接给个图片路径就搞定,

但是对于多个图片路径的切换,需要线程实现切换功能:

因为我们可以通过线程设置每隔400毫秒钟切换一次图片路径,切换完路径,就去执行语句:面板内容添加进图标控件,使得当前图片得到了播放,

然后切换到新的一张图片,又面板内容添加进图标控件,播放当前图片。。。。。。

正是因为有了线程,在400毫秒内,我们可以做其他事情:面板内容添加进图标控件,播放当前图片,然后时间到了400毫秒那一刻时,执行线程里的任务:切换一次图片路径

 

如果没有多线程,可以看下代码变成如下:

int i = 0; 
        while (i < 0) {
            try {
                if(i <= 0 || i > 5) {    //因为图片数组的长度是6,数组下标越界的处理
                    i = 0;
                }
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //添加图片
            lblImageIcon.setIcon(images[i]);
            i++;
        }
        // 面板内容添加图片控件
        panelContent.add(lblImageIcon);

 

代码分析:切换图片死循环一直死循环切换着,没有机会给到面板内容去添加图片控件,就实现不了播放呀。

我们要通过死循环不断的切换图片路径(动态一直播放),然后给到面板内容去添加图片控件的机会

(依靠线程,在某个时间里可以做某些事情,到了线程里设置的时间点再去做线程的任务)。

 

 

总结:通过动态播放图片的小应用,我们明白了线程的作用就是在一段时间段里做其他事情,到点了就执行线程里的任务。

目录
相关文章
|
3月前
|
Java Android开发 UED
🧠Android多线程与异步编程实战!告别卡顿,让应用响应如丝般顺滑!🧵
【7月更文挑战第28天】在Android开发中,确保UI流畅性至关重要。多线程与异步编程技术可将耗时操作移至后台,避免阻塞主线程。我们通常采用`Thread`类、`Handler`与`Looper`、`AsyncTask`及`ExecutorService`等进行多线程编程。
52 2
|
2月前
|
存储 SQL 缓存
揭秘Java并发核心:深度剖析Java内存模型(JMM)与Volatile关键字的魔法底层,让你的多线程应用无懈可击
【8月更文挑战第4天】Java内存模型(JMM)是Java并发的核心,定义了多线程环境中变量的访问规则,确保原子性、可见性和有序性。JMM区分了主内存与工作内存,以提高性能但可能引入可见性问题。Volatile关键字确保变量的可见性和有序性,其作用于读写操作中插入内存屏障,避免缓存一致性问题。例如,在DCL单例模式中使用Volatile确保实例化过程的可见性。Volatile依赖内存屏障和缓存一致性协议,但不保证原子性,需与其他同步机制配合使用以构建安全的并发程序。
61 0
|
3月前
|
Java 编译器
创建线程方式及应用总结
创建线程方式及应用总结
29 0
|
9天前
|
负载均衡 Java 调度
探索Python的并发编程:线程与进程的比较与应用
本文旨在深入探讨Python中的并发编程,重点比较线程与进程的异同、适用场景及实现方法。通过分析GIL对线程并发的影响,以及进程间通信的成本,我们将揭示何时选择线程或进程更为合理。同时,文章将提供实用的代码示例,帮助读者更好地理解并运用这些概念,以提升多任务处理的效率和性能。
|
11天前
|
Java 开发者
Java中的多线程基础与应用
【9月更文挑战第22天】在Java的世界中,多线程是一块基石,它支撑着现代并发编程的大厦。本文将深入浅出地介绍Java中多线程的基本概念、创建方法以及常见的应用场景,帮助读者理解并掌握这一核心技术。
|
14天前
|
Java Android开发 UED
🧠Android多线程与异步编程实战!告别卡顿,让应用响应如丝般顺滑!🧵
在Android开发中,为应对复杂应用场景和繁重计算任务,多线程与异步编程成为保证UI流畅性的关键。本文将介绍Android中的多线程基础,包括Thread、Handler、Looper、AsyncTask及ExecutorService等,并通过示例代码展示其实用性。AsyncTask适用于简单后台操作,而ExecutorService则能更好地管理复杂并发任务。合理运用这些技术,可显著提升应用性能和用户体验,避免内存泄漏和线程安全问题,确保UI更新顺畅。
35 5
|
23天前
|
缓存 监控 Java
Java中的并发编程:理解并应用线程池
在Java的并发编程中,线程池是提高应用程序性能的关键工具。本文将深入探讨如何有效利用线程池来管理资源、提升效率和简化代码结构。我们将从基础概念出发,逐步介绍线程池的配置、使用场景以及最佳实践,帮助开发者更好地掌握并发编程的核心技巧。
|
20天前
|
Java 调度 开发者
Java中的多线程基础及其应用
【9月更文挑战第13天】本文将深入探讨Java中的多线程概念,从基本理论到实际应用,带你一步步了解如何有效使用多线程来提升程序的性能。我们将通过实际代码示例,展示如何在Java中创建和管理线程,以及如何利用线程池优化资源管理。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧,帮助你更好地理解和应用多线程编程。
|
2月前
|
Java 数据库
异步&线程池 CompletableFuture 异步编排 实战应用 【终结篇】
这篇文章通过一个电商商品详情页的实战案例,展示了如何使用`CompletableFuture`进行异步编排,以解决在不同数据库表中查询商品信息的问题,并提供了详细的代码实现和遇到问题(如图片未显示)的解决方案。
异步&线程池 CompletableFuture 异步编排 实战应用 【终结篇】
|
3天前
|
数据采集 消息中间件 并行计算
进程、线程与协程:并发执行的三种重要概念与应用
进程、线程与协程:并发执行的三种重要概念与应用
14 0