java之线程
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中):
当我们建立双缓冲之后,我们做的游戏就不会这么闪啦;
java之线程的更多相关文章
- Java 使用线程方式Thread和Runnable,以及Thread与Runnable的区别
一. java中实现线程的方式有Thread和Runnable Thread: public class Thread1 extends Thread{ @Override public void r ...
- Java的线程安全
线程安全 我们这里讨论的线程安全,就限定于多个线程之间存在共享数据访问这个前提,因为如果一段代码根本不会与其他线程共享数据,那么从线程安全的角度来看,程序是串行执行还是多线程执行对它来说是完全没有区别 ...
- 深入理解Java之线程池
原作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本文归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...
- java中线程分两种,守护线程和用户线程。
java中线程分为两种类型:用户线程和守护线程. 通过Thread.setDaemon(false)设置为用户线程: 通过Thread.setDaemon(true)设置为守护线程. 如果不设置次属性 ...
- java 多线程—— 线程让步
java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...
- java 多线程—— 线程等待与唤醒
java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...
- Java的线程模型
并发不一定要依赖多线程(如PHP中很常见的多进程并发),但是在Java里面谈论并发,大多数都与线程脱不开关系. 线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开, ...
- Java多线程 - 线程状态
转自: http://www.cnblogs.com/lwbqqyumidi/p/3804883.html 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的 ...
- Java Thread线程控制
一.线程和进程 进程是处于运行中的程序,具有一定的独立能力,进程是系统进行资源分配和调度的一个独立单位. 进程特征: A.独立性:进程是系统中独立存在的实体,可以拥有自己独立的资源,每个进程都拥有自己 ...
随机推荐
- iOS 杂笔-25(不要用copy修饰NSMutableString)
iOS 杂笔-25(不要用copy修饰NSMutableString) 首先对题目进行简单的解释,我所说的不要用copy修饰NSMutableString不是说完全不可以用.但是要清楚一点,既然使用N ...
- js实现动态操作table
本章案例为通过js,动态操作table,实现在单页面进行增删改查的操作. 简要案例如下: <%@ page language="java" contentType=&quo ...
- ORA-14452的出现原因解析及解决方法
在删除临时表时遇到了ORA-14452错误:ORA-14452: attempt to create , alert or drop an index on temporary table alrea ...
- Redhat Linux安装JDK 1.7
本篇主要介绍在Redhat Linux(Red Hat Enterprise Linux Server release 5.7 (Tikanga))系统上安装JDK 1.7,其它Linux平台安装也大 ...
- mysql 5.5.32 多实例环境的启动问题
[root@localhost scripts]# /bin/sh mysql_install_db --user=mysql --dasedir=/application/mysql --dat ...
- SQL Server自动化运维系列——监控跑批Job运行状态(Power Shell)
需求描述 在我们的生产环境中,大部分情况下需要有自己的运维体制,包括自己健康状态的检测等.如果发生异常,需要提前预警的,通知形式一般为发邮件告知. 在上一篇文章中已经分析了SQL SERVER中关于邮 ...
- mysql查询优化建议(百度)
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使 ...
- AngularJS笔记---作用域和控制器
什么是作用域. 什么是控制器, 作用域包含了渲染视图时所需的功能和数据,它是所有视图的唯一源头.可以将作用域理解成试图模型(ViewModel). 作用域之间可以是包含关系也可以是独立关系.可以通过设 ...
- MMORPG大型游戏设计与开发(服务器 AI 概述)
游戏世界中我们拥有许多对象,常见的就是角色自身以及怪物和NPC,我们可以见到怪物和NPC拥有许多的行为,比如说怪物常常见到敌对的玩家就会攻击一样,又如一些NPC来游戏世界中走来走去,又有些怪物和NPC ...
- 更为简单的Ctrl+S自动刷新浏览器工具-LinrF5
一款自动刷新浏览器的小工具,它通过监听用户的按键,如果在键盘按下 Ctrl+S ,则自动刷新浏览器,操作十分简单,前端开发必备神器,快速提升工作效率,支持IE.火狐以及最新版的chrome33.之前我 ...