java之线程
一:线程:
线程是什么呢?线程,有时被称为轻量级进程是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。
线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。
线程,在程序中起到的作用,我觉得就是一个当需要程序几乎在同一时间执行多个任务,并且不受干扰时需要用到。在程序中,我们都是从主函数的第一行,然后一行行的执行下来,只有前面的语句执行完了,我们才可以去执行下面的代码,而线程的作用就是,开启一个线程之后,然后把这一行或者多行代码,总之是一个任务交给线程去执行,然后不管他有没有执行完我都可以继续执行接下来的代码;就好比之前是只能写完作业了,再去看电视,但是开启线程之后就像是我进行了做作业的这个动作,但是我不管作业有没有做完,然后我又可以去看电视了。多线性的话,也是如此,老师布置了作业,分配每个学生任务,然后学生自己各自去做,至于谁先完成,这个老师就不管了,老师也是自己去做事了。
然后呢我们再来看一看进程,进程就是运行中的程序,进程是在内存上运行,线程是在进程中运行,线程是不会有自己独立的内存空间的,线程在运行后,无法获取其他线程改变对象,属性或变量,也就是线程质检,在开始工作之后,就不能愉快的沟通了。而在变量前加上volatile就可以解决了。
二:线程的实现
1.线程的实现的两种方法:
一:继承Tread类;
run()运行方法;
start()启动线程的方法;
sleep(int time)线程休眠的方法 ,参数是休眠的时长;
二:实现Runnable接口
只存在线程的run()运行方法;
2.实现Runnable接口比继承Thread类所具有的优势:
1):适合多个相同的程序代码的线程去处理同一个资源
2):可以避免java中的单继承的限制
3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立。
三:线程控制小球的移动
在点击窗体之后就会出现一个移动的小球。
- 要一个窗体类,实例化一个Jframe,同时该类实现监听事件接口MouseListener,实例化抽象方法;
要控制多个小球在窗体上移动,我们可以把小球当做一个对象,建立一个类Ball类;
Ball类:属性:小球的位置(x,y的坐标),小球移动的速度,
方法:小球移动的方法,画小球的方法,擦出小球的方法,
然后还需要重写构造方法,在实例化的时候需要传入小球的坐标;
同时还需要传入窗体的画笔;
3.实现线程,Ball继承Thread类(或者窗体类实现Runable接口),然后都要实现重写run()方法;在run方法中实现小球的移动;
4.在窗体类中开启线程;
如果是实现了Runable接口的话 ,开启线程则是需要声明并且实例化一个类然后调用run方法:
四:一个线程控制多个小球
在上面的的方法中是每点击一次就会开启一个线程,也就是多线程;而当小球点击的数量多了的时候就会出现很闪的情况,而之所以出现这样的情况也就是因为我们的小球画的时候都会去调用一个画笔对象,而我们的线程并不是同步的,所以会出现那种,1号线程要画一个白色的小球(擦出),但是2号小球要画一个黑的小球,这时,画笔对象的变化就会引起窗体特别闪烁的情况;
解决这个问题的一个办法就是:用一个线程来控制多个小球。
而要实现一个线程来控制多个小球,我们需要把小球存起来,在画的时候从中取出来就可以了;
我们来看代码:1,首先定义一个数组,然后每点击一次小球都存进去;
2.在窗体可见之后,就开启线程;
3.因为在没有点击界面的时候,数组里面是空的,所以需要在画的时候判断数组是否为空,不为空,有小球,在画;
另外,就是建立双缓冲了,所谓双缓冲,就是在内存中开辟一片区域,作为后台图象,程序对它进行更新、修改,绘制完成后再显示到屏幕上。其思想,简单来说就是把需要画的所有的小球先画在(用Image的画笔)一个Image上面,然后在用窗体的画笔画在窗体上;
在AWT中的双缓冲,需要重写update方法,在update里面中建立双缓冲;在AWT组件中使用update()方法清空矩形区域,然后调用paint的方法来绘制图片;
而在SWiNG组件中,因为SWiNG组件中的JFrame继承了AWT组件的Frame并且重写了update方法(调用了paint方法),没有在去清空组件上的内容;所以SWING中重写paint(),建立双缓冲;
具体代码(JFrame中):
当我们建立双缓冲之后,我们做的游戏就不会这么闪啦;