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. Java打印九九乘法表

    package com.czgo; /** * 九九乘法表 * * @author AlanLee * */ public class Print99 { public static void mai ...

  2. mvc中服务器端、客户端属性验证

    在mvc中使用表单进行数据提交时,数据验证分为服务器端验证和客户端验证: 我们可以通过使用HtmlHelper中的方法及在页面中引用js库对Model的属性的数据注解(System.Component ...

  3. Linux NetHogs监控工具介绍

    NetHogs介绍 NetHogs是一款开源.免费的,终端下的网络流量监控工具,它可监控Linux的进程或应用程序的网络流量.NetHogs只能实时监控进程的网络带宽占用情况.NetHogs支持IPv ...

  4. JDK1.3安装出现/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory Done.

    今天是出道以来第一次安装JDK1.3,大学的时候接触的也已是JDK1.4,而且是在Red Hat Enterprise Linux Server release 6.6上,安装JDK1.3是由于软件组 ...

  5. You must use the Role Management Tool to install or configure Microsoft .NET Framework 3.5 SP1

    今天在Windows Server 2008 下安装SQL SERVER 2008时,碰到如下错误: You must use the Role Management Tool to install ...

  6. YourSQLDba将数据库置于紧急模式的原因浅析

    从SQL SERVER 2000 上迁移了一个数据库到SQL SERVER 2008 R2上,暂且用DataBaseName代替迁移的真实的数据库名(后面的资料也会将数据库真实的名字用DataBase ...

  7. js获取浏览器内核、类型、版本以及系统类型

    正则表达式: var rsys = /\b(windows|win32|macintosh|mac os x|adobeair|linux|unix)\b/; var rkn = /\b(opera| ...

  8. c#获取时间

    DateTime.Now.AddDays(10).ToShortDateString().ToString() addDays(整数) 一天前DateTime.Now.AddDays(-1).ToSh ...

  9. SQL Server 2008 R2——使用计算列为表创建自定义的自增列

    =================================版权声明================================= 版权声明:原创文章 谢绝转载  请通过右侧公告中的“联系邮 ...

  10. linux top 源码分析

    /* * Copyright (c) 2008, The Android Open Source Project * All rights reserved. * * Redistribution a ...