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. IOS基础之UILineBreakModeWordWrap

    UILineBreakModeWordWrap详细解释如下:  typedef enum {     UILineBreakModeWordWrap = 0,     UILineBreakModeC ...

  2. JavaScript语言精粹(读书笔记)

    第一章 精华 1,JavaScript的函数(主要)基于词法作用域(lexical scoping)的顶级对象.强类型语言允许编译器在编译时检测错误,但弱类型很自由,无需建立复杂的类层次,不用做强制造 ...

  3. SQL Server 2012 安装图解教程

    在安装微软最新数据库SQL Server 2012之前,编者先确定一下安装环境:Windonws 7 SP1,32位操作系统.CPU是2.1GHz赛扬双核T3500,内存2.93GB 安装SQL Se ...

  4. 数据库服务器改名导致Reporting Service不可用的案例

    案例环境: 操作系统版本    :    Windows Server 2012 R2 Standard 数据库版本      :   SQL Server 2012 Standard Edition ...

  5. MongoDB学习笔记~关于官方驱动集成IQueryable之后的一些事

    回到目录 关于官方驱动集成IQueryable之后的一些事,有好事也有坏事,好事就是它会将你的linq语句非常友好的翻译成MongoDB语句,而坏事就是有一些linq语句不会被翻译,不会被翻译的代价就 ...

  6. 在Windows上安装虚拟机详细图文教程

    用虚拟机来安装最新的软件,安装最新的系统等等比较保险,可以避免安装不顺利影响自己原来的系统和应用,想尝鲜又担心自己完全更换系统不适应的朋友可以尝试. 虚拟机下载:https://yunpan.cn/c ...

  7. Linux下java进程CPU占用率高分析方法

    Linux下java进程CPU占用率高分析方法 在工作当中,肯定会遇到由代码所导致的高CPU耗用以及内存溢出的情况.这种情况发生时,我们怎么去找出原因并解决. 一般解决方法是通过top命令找出消耗资源 ...

  8. SQL SERVER 2014 各个版本支持的功能

    转自:https://technet.microsoft.com/library/cc645993 转换箱规模限制 功能名称 Enterprise Business Intelligence Stan ...

  9. Redis学习和环境搭建

    基本的redis教程,搭建,可以参照下面任一教程: 地址一:http://www.yiibai.com/redis/redis_quick_guide.html 地址二:http://www.runo ...

  10. hdu 4704 Sum (整数和分解+快速幂+费马小定理降幂)

    题意: 给n(1<n<),求(s1+s2+s3+...+sn)mod(1e9+7).其中si表示n由i个数相加而成的种数,如n=4,则s1=1,s2=3.                  ...