第一个并发程序:定义任务和驱动任务
2016-09-21 14:34
357 查看
并发编程使我们可以将程序划分为多个分离的,独立运行的任务。通过使用多线程机制,这些独立任务(也被成为子任务)中的每一个都将由执行线程来驱动。在使用线程时,CPU将轮流给每个任务分配其占用时间。每个任务都觉得自己在一直占用CPU,但事实上CPU时间是划分成片段分配给了所有的任务。
定义任务
线程可以驱动任务,因此我们需要一种描述任务的方式,实现Runnable接口并编写run()方法即可定义任务。例如下面的显示代码:packagecom; /** *类LiftOff.java的实现描述:显示发射之前的倒计时 * *@authorwql2016年9月21日下午1:46:46 */ publicclassLiftOffimplementsRunnable{ publicLiftOff(){ taskCount++;//计数自增 } privateintcountDown=3;//倒计时数字 privatestaticinttaskCount=0; privateintid=taskCount; @Override publicvoidrun(){ while(countDown>=0){ System.out.println("线程编号"+id+"--倒计时"+countDown); countDown--; Thread.yield();
}}}
//Thread.yield()的调用是对线程调度器的一种建议,声明自身已完成重要的部分,可将程序切换给其他任务执行。 此时可以直接用main方法调用run(),但这种方式并不会产生任何线程能力,就像你调用一个普通的类方法一样。
packagecom; publicclassMain{ publicstaticvoidmain(String[]args){ LiftOffliftOff=newLiftOff(); liftOff.run(); System.out.println("end"); } }输出:
线程编号0--倒计时3 线程编号0--倒计时2 线程编号0--倒计时1 线程编号0--倒计时0 end
驱动任务
将Runnable对象转变为工作任务的方式是把它提交给一个Thread构造器:packagecom; publicclassMain{ publicstaticvoidmain(String[]args){ Threadt=newThread(newLiftOff()); t.start(); System.out.println("end"); } }输出:
end 线程编号0--倒计时3 线程编号0--倒计时2 线程编号0--倒计时1 线程编号0--倒计时0通过调用Thread的start()方法启动任务,此时LiftOff.run()由一个新的线程执行,程序的main()方法也是一个线程,因此,程序会“同时”运行两个方法,我们看到“end”先被输出。我们可以很容易添加更多的线程去驱动更多的任务:
packagecom; publicclassMain{ publicstaticvoidmain(String[]args){ for(inti=0;i<3;i++){ newThread(newLiftOff()).start(); } System.out.println("end"); } }输出:
线程编号0--倒计时3 线程编号2--倒计时3 end 线程编号1--倒计时3 线程编号2--倒计时2 线程编号2--倒计时1 线程编号2--倒计时0 线程编号0--倒计时2 线程编号0--倒计时1 线程编号0--倒计时0 线程编号1--倒计时2 线程编号1--倒计时1 线程编号1--倒计时0输出说明不同任务的执行在线程被切换时混在了一起,而每一次的输出结果可能会完全不同,因为线程调度机制是非确定性的。
相关文章推荐
- Linux驱动开发系列之二:第一个linux驱动hello word程序
- WCF(2)我的第一个WCF程序,(解决方案结构、服务契约定义、服务契约定义等)
- 驱动开发(第一个程序Hello World)
- [arm驱动]platform第一个程序led灯循环
- Oracle EBS可执行、并发程序的定义
- OpenNMS 守护程序:并发管理任务
- 错误 78 “Web.NewsDetail”不包含“Label1”的定义,并且找不到可接受类型为“Web.NewsDetail”的第一个参数的扩展方法“Label1”(是否缺少 using 指令或程序
- 《第十三周任务三》写一个程序,定义抽象基类Shape,由它派生出3个派生类,Circle(圆形)、Rectangle(矩形)、Triangle(三角形)。用如下的mian()函数,求出定义的几个几何体
- 第十三周【任务三】【任务3】写一个程序,定义抽象基类Shape,由它派生出3个派生类,Circle(圆形)、Rectangle(矩形)、Triangle(三角形)。
- 并发编程--运行多个任务并处理第一个结果
- 程序江湖:第十三章 风险驱动的任务
- 第九周实验报告任务 1 定义Time类中的<<和>>运算符重载,实现时间的输入输出,改造原程序中对运算结果显示方式,使程序读起来更自然。
- 第九周任务三--定义分数类中<<和>>运算符重载,实现分数的输入输出,使程序读起来更自然。
- 第7周任务1—求两数正差值——亲,这可是我自行设计的第一个程序啊!
- 第九周实验报告任务3 定义分数类中<<和>>运算符重载,实现分数的输入输出,改造原程序中对运算结果显示方式,使程序读起来更自然。
- OpenNMS 守护程序:并发管理任务
- 第九周实验任务二--定义Complex类中的<<和>>运算符的重载,实现输入和输出,使程序读起来更自然
- 第九周实验报告 任务2 定义Complex类中的<<和>>运算符的重载,实现输入和输出,改造原程序中对运算结果显示方式,使程序读起来更自然。
- 第一个驱动测试程序的调试和疑问
- TDD(测试驱动开发)学习二:创建第一个TDD程序