线程的应用在java的学习过程中简直就像开启了一个新纪元,过去的程序都是单线程,即JVM创建主线程顺序执行,直到程序结束,而多线程带来的另一个好消息是我们可以做一些更具有实际应用性的东西出来,比如~秒表
简单说一下线程创建方法,线程有三种常见的创建方法,其中最常见的是第一种
- 继承Thread 类实现线程
- 实现Runnable接口创建线程
- 继承TimerTask类实现线程的定时执行
第一种简单方便,最为常用,第二种先定义一个实现Runnable接口的类,实现它的run()方法,然后将这个类的实例作为Thread的构造方法的参数,创建Thread类的实例,即可作为线程启动,其实Thread本身也是实现了Runnable接口的类,这种方法较第一种的优点就是在类的创建时,该类还可以继承其他类,这是由于java的单继承机制造成的;同时我们当然也可以通过创建内部类方法方便的建立线程,这种方法在编写一些单线程应用时十分方便,在一个方法中就可以启动一个线程,而且这个线程可以直接调用类中的属性和方法,特别注意的是,在方法中启动匿名内部线程时,如果要向这个线程的run方法内传递参数,在创建方法中这个参数必须定义为final类型,对于第三种,有着独特的应用,在定时操作方面(后面在秒表的精度调节部分有代码)。
前面图中是一个界面粗糙的Demo,但对于秒表来说精度是一个很值得注意的问题,因为除了休眠,计时代码的执行也会消耗一部分时间,这会对秒表的精度造成很大的影响,当然这个我们还是可以解决的~
其实只需要将执行代码的时间计算出来,将其包含进休眠的10个毫秒里就可以
public void run() {
long lastTime = System.currentTimeMillis();
while (true) {
try {
sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 如果不为空,则添加标签和按钮
if (!f.getList_lab().isEmpty()) {
f.add(f.getList_lab().get(f.getList_lab().size() - 1));
f.add(f.getList_btn().get(f.getList_btn().size() - 1));
f.validate();
}
if (pauseflag) {
continue;
}
long endTime = System.currentTimeMillis();
if (endTime - lastTime >= 10) {
lastTime = System.currentTimeMillis();
count++;
sec = count / 100;
ms = count % 100;
if (sec == 60 && min < 59) {
count = 0;
sec = 0;
min++;
} else if (sec == 60 && min == 59) {
hour++;
min = -1;
sec = 0;
}
String s1 = String.valueOf(hour);
String s2 = String.valueOf(min);
String s3 = String.valueOf(sec);
String s4 = String.valueOf(ms);
if (hour < 10) {
s1 = "0" + s1;
}
if (min < 10) {
s2 = "0" + s2;
}
if (sec < 10) {
s3 = "0" + s3;
}
if (ms < 10) {
s4 = "0" + s4;
}
lab_time.setText(s1 + ":" + s2 + ":" + s3 + ":" + s4);
}
}
}
总的来说,,,,,,这种方法不是很专业,因为我们可以方便的使用定时器来完成定时任务,只需要两步就可以完成向这种方法的变化,将原来继承Thread的类改为继承TimerTask(定时任务),在主类创立一个该对象的实例和一个定时器对象的实例,再调用定时器的schedule方法就可以,图片就不展示了,因为和前面的相比完全看不出来效果 ^_^" 尴尬的笑.....
做秒表神马的都是小case,我们线程更多的应用在游戏方面(目前看来),游戏中画图的部分,比如一个小球。。。。。
当然,效果还是很值得改进的,我们甚至还可以让图片动起来。。。。
1. 这是一般添加图片的方法:
// 利用JLabel添加图片
ImageIcon bg = new ImageIcon("src/yk/time140319/hh.jpg");
JLabel lab_image = new JLabel();
lab_image.setIcon(bg);
this.add(lab_image);
这种方法会使图片以一个组件的形式表现出来,符合一般组件的规律,比如布局等等。
2.drawImage显示图片
// 重绘方法显示静态图片,可重绘
public void paint(Graphics g) {
super.paint(g);
int x = 0;
int y = 0;
ImageIcon bg = new ImageIcon("src/yk/time140319/hh.jpg");
g.drawImage(bg.getImage(), x, y, null);
}
这个方法用drawImage函数,但必须要在重绘函数中画出,否则不会显示。
3.那怎么让图片动起来呢,可以试一下在paint函数加一个while(true)循环,不断改变坐标值,敢试的话,呵呵,对不起,程序已死。。。这时候就该用线程解决了,顺便利用缓冲区画布使图像不再闪动,完美效果一次成型!
// 利用缓冲区加强效果
BufferedImage bu = new BufferedImage(f.getWidth(), f.getHeight(),
BufferedImage.TYPE_INT_RGB);
Graphics gr = bu.getGraphics();
// 填充缓冲区,不能用draw函数或clear函数
gr.fillRect(0, 0, f.getWidth(), f.getHeight());
gr.drawImage(bg.getImage(), x, y, null);
gr.drawImage(bg.getImage(), x + bg.getIconWidth(), y, null);
if (x + bg.getIconWidth() < 0) {
x = 0;
}
x--;
// BufferedImage图像显示的坐标
g.drawImage(bu, 0, 0, null);
刚刚在调试的时候发现图像移动的速度是与休眠时间有关的。
- 大小: 7.1 KB
- 大小: 12.9 KB
分享到:
相关推荐
在探讨iOS多线程的面试题目时,我们首先要明确进程和线程的定义及其关系。进程可以被理解为计算机上一次执行活动的程序,它是操作系统分配资源的基本单元,拥有独立的内存空间和运行所需的全部资源。当我们提到一个...
线程注入法 可过游戏保护 哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
在计算机编程中,线程是程序执行的基本单元,每个线程代表程序中的一个独立的控制流。线程控制是软件开发中的关键部分,特别是在多任务环境中,它可以优化资源使用并提高性能。 PowerBuilder提供了对线程的支持,...
哈哈”是一种轻描淡写的表述,暗示了在DOS下实现多线程是一项挑战性的工作,可能需要对底层硬件和操作系统的理解非常深入。 在标签中提到的“http://u.download.csdn.net/upfile”,这可能是分享资源的链接,通常在...
新建线程,并对线程命名
在探讨多线程脑图整理的过程中,我们需要掌握操作系统、进程、多线程、线程安全以及锁的概念和关系。首先,操作系统是计算机系统的核心软件,负责管理计算机硬件与软件资源,同时提供程序运行的基本环境。操作系统的...
多线程使用AutoResetEvent
在Android开发中,多线程处理是至关重要的,特别是在处理耗时操作如网络请求、大文件读写或复杂的计算任务时。本篇文章将深入探讨Android的多线程机制,包括如何创建新线程以及如何在不同线程间进行通信。 首先,...
哈哈哈哈,阿里面试总结 本资源摘要信息主要涵盖了阿里面试中IT相关知识点的总结,包括排序算法、Redis锁、多线程、锁的实现、Redis持久化等方面的知识点。 一、排序算法 在面试中,阿里常常会问到排序算法相关的...
哈哈〜秘密...这个以后再谈... 解决什么问题 Volley默认是在UI线程返回响应,导致如果还需要对数据进行操作(如DB,筛选,排序等相对耗时任务),则需要另起Task(非UI线程)去做。问题,甚至踏入callback深渊。解决...
Internet Download Manager(简称IDM)是一款广受好评的下载管理器软件,它以多线程加速下载和智能文件片段技术为核心优势,为广大用户提供了快速便捷的下载体验。特别是IDM的多线程技术,它在提升下载速度上的表现...
"java10.30哈哈哈哈"这个标题可能是指在2018年10月30日发布的Java版本,因为Java通常以日期作为版本号的一部分。然而,由于没有提供具体的版本信息,我们只能推测。 Java语言的特点包括: 1. **跨平台性**:通过...
一开始仿照原先作的远线程例子写了很麻烦需要动态调用的线程函数,结果弄了半天不行,后来又用IDA反汇编仔细研究WINDOWS远线程的特点,总算悟出点东东,于是一行语句就搞定了,哈哈。 4.用到了CMap映射类把列表项...
不过只能判断站点能否响应,对站点的内部错误未监控,然后服务器的网络响应速度就是用简单的Ping来响应获取,有点挫,不要喷我,哈哈。临时写的,没咋完善,合适于新手用来提升,里面的c# 多线程简单应用,以及定义...
"牧羊犬哈哈"是一个专为运维工作设计的脚本工具,它的主要功能包括多线程处理、日志记录和远程访问控制,旨在提升系统管理的自动化程度。在这个压缩包中,我们仅有一个名为"collie"的文件,推测这可能是整个运维脚本...
描述中的"哈哈哈哈哈"可能代表开发者或发布者对项目的热情和乐观态度,也可能是为了吸引用户的注意力,表示这个聊天室充满活力和趣味性。 在实现Java聊天室时,开发者可能会选择以下技术栈: 1. **多线程**:由于...
- 使用单线程轮循机制,可以确保图片下载在单一线程中进行,减少线程的创建和销毁,提高效率。 2. **任务队列**: - 创建一个`imageViewTask`类,包含图片的URL路径、Bitmap对象以及在列表中的位置等信息。 - `...
那就取指针吧,指针就是万能的,哈哈,不过呢也要注意内存泄漏哦! 亲测调用 线程转主线程调用空子程序 大约 1w次 花费 155ms ,速度呢也就是 差不多 65次/ms. 毕竟呢每次调用都要zc挂接事件,然后sendmessage,在...
自言自语:翻了一下自己的源码好像并没有什么值钱的东西,哈哈 开源大赛来凑个数。 这个例子只是我的思路,目的就是不在多线程内操作任何控件,利用队列来置超级列表框标题。 使用模块:精易模块 +鱼刺多线程6.0
6. **多线程**:Java内置了对多线程的支持,通过Thread类或Runnable接口可以创建和管理线程,理解并发执行的原理和同步机制,如synchronized关键字、wait()、notify()方法等。 7. **反射机制**:反射允许在运行时...