在Java中,由于一些需求,需要将某些“程序段”转成并发执行,每一个“程序段”是一个逻辑上相对完整的程序代码段。多线程的主要目的就是讲一个程序中的各个“程序段”并发化。
此时,我们引入多线程的概念,大多程序都是单线程的,即一个程序只有从头到尾执行一次,然而现实中我们可能需要多条途径同事运行,例如,我们可能需要一边听音乐,一边看书,又或是一个游戏中,我们需要boss和hero同时进行攻击等等。而多线程是指在同一个进程中同时存在多个执行体,按几条不同的执行路径同时工作。这正好满足了我们的需要,不是吗?
好了,到这里我就简单的介绍了多线程。线程就像人一样,也是有一个出生,成长再到生命尽头的过程的,这里专业的名词就是所谓的生命周期。线程生命周期图如下:
现在从底层浅谈一下线程调度。调度就是指在各个线程之间分配CPU资源。多个线程并发执行实际上是通过一个调度来进行的。线程调度有两种模型:分时和抢占模型。在分时模型中,CPU资源师按照时间片来分配,获得CPU资源的线程只能在指定的时间片执行,一旦时间片使用完,就必须把CPU让给另一个处于就绪状态的线程。在分时模型中,线程本身不会让出CPU:在抢占模型中,当前活动的线程一旦获得执行权,将一直执行下去,知道执行完或由于某周原因主动放弃执行权。Java语言支持的就是抢占式调度模型,为了使优先级的线程有机会运行,高优先级的线程应该不是地主动进入“睡眠”状态,而暂时让出CPU。
好了,说了这么多题外话,终于进入正题,线程的实现。其实依旧是按照线程的生命周期的过程书写代码。
此处大家需要重点关注的是线程中的run()方法,在主函数中我们调用start()方法的时候会自动执行run()方法,即启动即运行。当然由于我们的每一个Ball类要作为一个线程,所以Ball要继承Thread父类。
public class Ball extends Thread{ private JPanel jf; //半径 private int radius = 20; private int x,y; //x,y方向的速度 private int vx,vy; private Color color; //暂停 private boolean pauseFlag = false; //停止 private boolean stopFlag = false; private Graphics g; //链表队列,保存小球 private ArrayList<Ball> list; public Ball(JPanel jf,ArrayList<Ball> list){ this.list = list; this.jf = jf; Random r = new Random(); //x方向上的速度设为随机 vx = r.nextInt(5)+1; //y方向的速度设为随机 vy = r.nextInt(5)+1; //球的半径 radius = r.nextInt(50)+20; //颜色为随机 color = new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255)); } //设置暂停 public void setPause(boolean flag){ pauseFlag = false; } //设置停止 public void setStop(boolean flag){ stopFlag = flag; } //运行函数 public void run(){ g = jf.getGraphics(); while(true){ //先设置休眠 try { sleep(30); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } if(pauseFlag == true){ continue; } //清楚上一次的图 //clear(); if(stopFlag) return; //移动 move(); //画画 // draw2(g); } } }
主函数中启动线程:
ActionListener l = new ActionListener(){ public void actionPerformed(ActionEvent e){ if(e.getActionCommand().equals("start")){ //实例化一个小球对象 Ball t = new Ball(jf,list); //启动线程 t.start(); //将小球添加到列队里 list.add(t); } } }
最后,我在介绍几个线程中常用的几个方法。
线程通过多线程的实现貌似就好像动漫人物中的忍术——影分身,同时可以做多个事,但是主线程一般只有一个,就和本体只有一个一样。
相关推荐
《MFC多线程的创建,包括工作线程和用户界面线程》全面讲解...发送消息的时候,也有发送线程消息函数 PostThreadMessage来执行线程之间的消息,线程有启动线程与挂起线程;定时器有启动定时器,sleep休眠,杀死定时器!
单线程 单线程 单线程 单线程 单线程 单线程
内核线程就是内核的分身,一个分身可以处理一件特定事情。Linux内核使用内核线程来将内核分成几个功能模块,像kswapd、kflushd等, 这在处理异步事件如异步IO时特别有用。内核线程的使用是廉价的,唯一使用的资源...
在C#中,由于使用线程和调用UI的线程属于两个不同的线程,如果在线程中直接设置UI元素的属性,此时就会出现跨线程错误。 下面介绍两种解决方案 第一种:使用控件自带的Invoke或者BeginInvoke方法。 Task....
MFC多线程 工作者线程 用户界面线程
基于SpringBoot和POI实现单线程和多线程导出Excel.zip基于SpringBoot和POI实现单线程和多线程导出Excel.zip基于SpringBoot和POI实现单线程和多线程导出Excel.zip基于SpringBoot和POI实现单线程和多线程导出Excel.zip...
c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程...
易语言正确退出线程源码,正确退出线程,多线程,正常结束线程,提示信息,发送消息
多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程
mysql是线程不安全的,mysql不是线程安全的,多线程共用同一个mysql连接是会崩溃的 QT的QSqlDatabase是基于mysql的,所以一样是线程不安全的 现讲明mysql为什么是线程不安全的,以及在多线程环境下如何使用mysql,...
不多说请看源码,对线程级别控制,对线程的起动/暂停,同时对内存的释放,希望对大家有用
从属线程需要随时将中间结果先是在主界面上,鉴于控件总是由主执行线程所有,从属线程中对控件的任何调用都需要“封送处理”调用。 封送处理是跨线程边界移动调用的行为,需耗费大量的资源。为使需要发生的封送处理...
C# winform 多线程 让子线程也能操作界面的方法 源代码
可以根据这个示例,更能了解到单线程与多线程的区别所在
多线程和网络多线程和网络多线程和网络多线程和网络多线程和网络多线程和网络多线程和网络多线程和网络多线程和网络多线程和网络多线程和网络多线程和网络多线程和网络多线程和网络多线程和网络多线程和网络多线程和...
c# 多线程任务中结束全部线程
C#线程详解,单线程,多线程,线程管理 C#线程详解,单线程,多线程,线程管理
《秒杀多线程第十六篇 多线程十大经典案例之一 双线程读写队列数据》 ...为了让大家更加熟练运用多线程,将会有十篇文章来讲解十个多线程使用案例,相信看完这十篇后会让你能更加游刃有余的使用多线程。
详细的讲述了多线程的各种用法 Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠...
掌握线程创建和终止,加深对线程和进程概念的理解,会用同步与互斥方法实现线程之间的通信。 三、内容和要求 软件界面上点“创建线程” 按钮,创建三个生产者线程(P1,P2,P3)和两个消费者线程(C1,C2),生产者...