java之线程

一:线程:

线程是什么呢?线程,有时被称为轻量级进程是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。

线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。

线程,在程序中起到的作用,我觉得就是一个当需要程序几乎在同一时间执行多个任务,并且不受干扰时需要用到。在程序中,我们都是从主函数的第一行,然后一行行的执行下来,只有前面的语句执行完了,我们才可以去执行下面的代码,而线程的作用就是,开启一个线程之后,然后把这一行或者多行代码,总之是一个任务交给线程去执行,然后不管他有没有执行完我都可以继续执行接下来的代码;就好比之前是只能写完作业了,再去看电视,但是开启线程之后就像是我进行了做作业的这个动作,但是我不管作业有没有做完,然后我又可以去看电视了。多线性的话,也是如此,老师布置了作业,分配每个学生任务,然后学生自己各自去做,至于谁先完成,这个老师就不管了,老师也是自己去做事了。

然后呢我们再来看一看进程,进程就是运行中的程序,进程是在内存上运行,线程是在进程中运行,线程是不会有自己独立的内存空间的,线程在运行后,无法获取其他线程改变对象,属性或变量,也就是线程质检,在开始工作之后,就不能愉快的沟通了。而在变量前加上volatile就可以解决了。

二:线程的实现

1.线程的实现的两种方法:

一:继承Tread类;

run()运行方法;
start()启动线程的方法;
sleep(int time)线程休眠的方法 ,参数是休眠的时长;

二:实现Runnable接口

只存在线程的run()运行方法;

2.实现Runnable接口比继承Thread类所具有的优势:

1):适合多个相同的程序代码的线程去处理同一个资源

2):可以避免java中的单继承的限制

3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立。

三:线程控制小球的移动

在点击窗体之后就会出现一个移动的小球。

  1. 要一个窗体类,实例化一个Jframe,同时该类实现监听事件接口MouseListener,实例化抽象方法;
  2. 要控制多个小球在窗体上移动,我们可以把小球当做一个对象,建立一个类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中):

当我们建立双缓冲之后,我们做的游戏就不会这么闪啦;

java之线程的更多相关文章

  1. Java 使用线程方式Thread和Runnable,以及Thread与Runnable的区别

    一. java中实现线程的方式有Thread和Runnable Thread: public class Thread1 extends Thread{ @Override public void r ...

  2. Java的线程安全

    线程安全 我们这里讨论的线程安全,就限定于多个线程之间存在共享数据访问这个前提,因为如果一段代码根本不会与其他线程共享数据,那么从线程安全的角度来看,程序是串行执行还是多线程执行对它来说是完全没有区别 ...

  3. 深入理解Java之线程池

    原作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本文归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...

  4. java中线程分两种,守护线程和用户线程。

    java中线程分为两种类型:用户线程和守护线程. 通过Thread.setDaemon(false)设置为用户线程: 通过Thread.setDaemon(true)设置为守护线程. 如果不设置次属性 ...

  5. java 多线程—— 线程让步

    java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...

  6. java 多线程—— 线程等待与唤醒

    java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...

  7. Java的线程模型

    并发不一定要依赖多线程(如PHP中很常见的多进程并发),但是在Java里面谈论并发,大多数都与线程脱不开关系. 线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开, ...

  8. Java多线程 - 线程状态

    转自: http://www.cnblogs.com/lwbqqyumidi/p/3804883.html 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的 ...

  9. Java Thread线程控制

    一.线程和进程 进程是处于运行中的程序,具有一定的独立能力,进程是系统进行资源分配和调度的一个独立单位. 进程特征: A.独立性:进程是系统中独立存在的实体,可以拥有自己独立的资源,每个进程都拥有自己 ...

随机推荐

  1. SE(homework3)_敏捷模型

    今天老师上课主要和我们讲解了软件开发模型类型.既然是敏捷模型,那么什么是非敏捷模型呢?了解这里点,会更清楚什么是敏捷模想.我们所知道的非敏捷模型有瀑布模型,我们知道这是早期软件开发的经典模型,流程主要 ...

  2. MySQL server version for the right syntax to use near 'TYPE=MyISAM'

    最近将一个版本为4.0.18-Max的MySQL数据库迁移到5.6.20-enterprise-commercial-advanced上.好吧,这是我迄今为止,见到过的最古老版本的MySQL数据库,这 ...

  3. Python中的绝对路劲和相对路径

    1.绝对路径 os.path.abspath("文件名"): 显示的是一个文件的绝对路劲 eg: >>> import os >>> os.ch ...

  4. rawurlencode / urlencode

    rawurlencode遵守是94年国际标准备忘录RFC 1738,urlencode实现的是传统做法,和上者的主要区别是对空格的转义是'+'而不是'%20' 推荐在PHP中使用用rawurlenco ...

  5. 详解Python中的循环语句的用法

    一.简介 Python的条件和循环语句,决定了程序的控制流程,体现结构的多样性.须重要理解,if.while.for以及与它们相搭配的 else. elif.break.continue和pass语句 ...

  6. chm文件突然乱码了

    今天打开一个chm文件的帮组文档时,文档时乱码,以前可不是的哦.不知道自己干什么操作了.上网找了下解决办法. 打开cmd 输入regedit 进入注册表:找到: HKEY_CURRENT_USER\S ...

  7. 基于GPUImage的多滤镜rtmp直播推流

    之前做过开源videocore的推流改进:1)加入了美颜滤镜; 2) 加入了librtmp替换原来过于简单的rtmpclient: 后来听朋友说,在videocore上面进行opengl修改,加入新的 ...

  8. cookie实现记住密码

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  9. 电信行业的BI应用

    截至2015年年底,我国三大运营商的移动用户数达到13.1亿户,4G /3G用户累计达到8.09亿户,再次创下新高.从三大运营商的年度财报来看,在具体业务方面,三大运营商的数据流量业务带来的收入均已超 ...

  10. postman使用之四:切换环境和设置读取变量

    postman提供了environment管理功能,想要在多个环境中测试,比如在测试环境.灰度环境.生产环境等,只需要用同样的接口,切换下环境即可,非常方便.具体步骤: 切换环境 1.点击界面右上角的 ...