由1个以上的线程所构成的程序称为多线程程序。Java语言写成的程序一定是从主程序开始操作,所以必须在程序的某个位置启动新的线程,才能算是真正的多线程程序。
1、 线程启动
1) 利用Thread类的子类
新写一个类,继承自Thread,重写里面的run()方法。在主程序里调用start()方法,就会启动一个线程,并执行run()内的代码。注意,被调用出来的新线程是start方法,而非run()方法。当然也可以调用run()方法,只是这样不会启动新的线程。
调用start方法后,Java执行处理系统就会在背后启动新的线程。再由这个新的线程调用run()方法。调用run()方法时,会有两个操作:
·启动新的线程
·调用run()方法
注意类的实例和线程本身是两个不同的部分。即使建立了类的实例,也还没有启动线程,而且就算线程已近结束,类的实例也不会就这样消失不见。
在主线程内启动两个两个子线程后,即使主线程立即结束,整个程序也不能算做完全结束,一直要等到所有线程都已近结束,程序才会结束。
当所有线程都结束是,程序也就结束了。不过,在判断是否结束是,并不包括daemon thread。也就是说,即使daemon thread还在,只要非daemon thread的线程都已近结束,程序即已近停止。
2) 利用Runnable接口
已实现Runnable接口的类必须实现run()方法。其过程如下:建立一个实现了Runnable接口的类,将该类实例传给Thread的构造器,调用start()方法。
Thread类本身也实现了Runnable接口,也有run()方法。只不过Thread类的run()方法为空,没有执行任何部分。Thread类的run()方法通常都是被子类覆盖的。
2、 线程的暂时停止
利用Thread类的sleep()方法即可以暂时停止线程的执行操作。sleep()方法在调用时被放在try-catch语句里面,这是因为sleep()方法可能会抛出也给InterruptedException的异常,这是用在取消线程处理时的异常。
利用sleep()方法所设置的暂时停止时间并不是很精密,所以不太适合用在实时控制的方面。若利用以下的语法结构,则可以ns(10^-9)为单位设置停止时间。
Thread.sleep(ms,ns);
不过一般的Java处理系统并不需要用到这么精密的控制方式。实时上,控制的精度有多高要依Java处理系统而定。
如果要唤醒被Thread.sleep暂停的线程,则可利用interrupt方法。
3、 线程的共享互斥:
1) sychronized
当一个方法加上关键字sychronized声明后,就可以让1个线程操作这个方法。这里指每次只有一个线程可以执行这个方法,这个方法有被称为同步方法。非sychronized就没有这个限制同时可供2个以上的线程执行。
一旦一个线程执行sychronized方法就获得一把锁,可以防止其他线程进入;当执行结束时,锁就释放了。当锁释放后,刚才因为所定而不得其门而入的多个线程便开始抢夺锁定,一定会有一个线程获得锁定。在同一时间点获取锁定的也只有一个线程,若等待的线程不止一个,没抢到得线程就得继续等候。
线程共享互斥的构架称为监视(monitor),而获取锁定时有时也称为持有(own)监视。
2) sychronized阻挡
如果只想启动方法里一部分的线程,而非启动整个方法时,则可使用sychronized阻挡,其格式如下
Sychronized(表达式){
……
}
则需要使用sychronized阻挡
4、 线程的协调
当有一个线程正在执行sychronized方法时,其它线程无法执行该方法。这是简单的型的共享互斥。进一步要求就是“空间是否有空闲”为条件进行线程处理。Java里有wait(),notify()和notifyAll()三个方法可进行这个处理。其中,wait()是让线程乖乖等候的方法,而notify()和notifyAll()则是启动等候中的线程的方法。
1) wait set
所有实例都有一个wait set,wait set是一个在执行该实例的wait方法是、操作停止的线程的集合。一执行wait方法时,线程便会暂时停止操作,进入wait set。只有在下面几种情况才有可能推出wait set。
·有其它线程以notify()方法唤醒该线程;
·有其它线程以notifyAll()方法唤醒该线程;
·有其它线程以interrupt()方法唤醒该线程;
·wait方法已经到期了。
wait set是一个虚拟的概念。它既不是实例的字段,也不是可以获取在实例wait中线程的列表的方法。
使用notify()方法时,有一个线程将会从wait set里退出,被notify唤醒的线程并不是在notify的一瞬间重新开始执行的。这是因为notify()的那一刻,执行notify()的线程还握着锁不放,所以其它线程无法获取该实例的锁。
假设执行notify()方法时,wait set里正在等候的线程不止1个。规格里并没有注明此时该选择哪一个线程。究竟是选择等待线程列表中的第一个,随机选择或是另以其它方式选择,则依Java处理系统的而异。因此在写程序时,程序属性最好不要写成会因所选线程而又所变动。
若没有锁定的线程去调用wait(),notify()或notifyAll()时,便会抛出异常java.lang.IllegalMonitorStateException。
notify()方法和notifyAll()方法两者非常相似,到底该用哪一个?老实说,这个选择有点难。
选择notify的话,因为要唤醒的线程比较少,程序处理速度当然比notifyAll()略胜一筹。
但选择notify()时,若这部分处理得不好,可能会有程序挂掉的危险性。一般来说,选择notifyAll()所写出来的程序代码会比选择notify()可靠。
除非能确定对程序的代码意义一清二楚,否则选择notifyAll()应该稳扎稳打。
分享到:
相关推荐
总结,开发聊天工具涉及到网络编程、多线程、数据交换格式、用户界面设计等多个核心领域,Java以其丰富的库和强大的跨平台特性,为实现这样的项目提供了坚实的基础。"天翔ZZ"作为一个实例,展示了如何用Java语言构建...
总的来说,“zz.rar_JAVA俄罗斯方块”项目不仅涵盖了JAVA语言的基础知识,还涉及到图形用户界面、事件处理、线程控制等多个高级主题,是学习JAVA编程和游戏开发的理想实践案例。通过分析和实现这个项目,开发者不仅...
4. JAVA 多线程并发 5. JAVA 基础. 6. SPRING 原理 7. 微服务 8. NETTY 与 RPC 9. 网络 10. 日志 11. ZOOKEEPER 12. KAFKA 13. RABBITMQ 14. HBASE 15. MONGODB 16. CASSANDRA 17. 设计模式 18. 负载均衡 19. 数据库...
3. **联机功能**: 实现游戏的多人在线对战,需要掌握网络编程,如TCP/IP套接字编程、多线程处理客户端请求,以及可能的并发控制技术。 【潜在的文件结构与内容】 由于未提供具体的压缩包文件名称列表,我们可以推测...
总结,本教程介绍了如何在Java中使用`RandomAccessFile`和多线程技术处理大文件。通过理解这些概念和技术,开发者可以编写出更高效的文件处理程序,尤其是对于处理大量数据的场景。记得在实践中不断测试和优化,以...
- **多线程处理**:为了提高用户体验,游戏中可能会用到多线程来处理不同的任务,比如UI更新与后台计算分离。 - **图形界面设计**:游戏界面的设计同样非常重要。Java中有Swing和JavaFX两种主要的GUI框架可供选择。 ...
4. **多线程**:为了保证系统的响应速度,特别是在并发用户较多的情况下,多线程技术可以用来处理不同的任务,如同时处理多个学生的签到请求。 5. **事件驱动编程**:在GUI中,用户的行为通常触发特定的事件,如...
总的来说,“zz-doctor”作为一个中医信息化的Android应用,其背后涵盖了Android应用开发的全貌,包括基本组件的使用、UI设计、数据管理、网络通信等多个方面。对于想要学习或提升Android开发技能的人员来说,深入...
- **多线程**:在高并发的环境下,系统可能需要同时处理多个车辆的入场和离场请求,因此多线程技术是必不可少的,可以保证系统的高效运行和资源的合理分配。 - **数据库交互**:系统需要持久化存储车辆信息、车位...
8. **多线程**:在需要并发处理的情况下,如用户同时登录或管理员进行后台操作,可能会用到多线程技术。 9. **设计模式**:如单例模式可能用于数据库连接池的管理,工厂模式用于创建GUI组件等。 10. **测试**:单元...
- **多线程**:如`java.lang.Thread`类,支持并发编程。 - **网络编程**:如`java.net`包,支持网络通信功能。 通过理解这四个核心思想,我们可以更好地掌握Java语言的特点和优势,同时也能更加高效地进行Java程序...
而对于计算密集型任务,多线程可以带来性能提升。 #### 五、算法复杂度优化 1. **重要性**:算法复杂度直接影响着程序的性能。 2. **策略**: - **选择高效的算法和数据结构**:例如,使用哈希表而不是链表进行...
- **多线程处理**:为了提高游戏性能,通常会采用多线程技术来处理不同任务,如游戏逻辑处理和网络通信。 - **算法优化**:合理运用数据结构和算法优化游戏逻辑处理,提升游戏流畅度。 ### 4. 开发工具与环境搭建...
中级阶段的源代码将更深入,可能会涵盖异常处理、多线程、集合框架、IO流、面向对象设计原则等内容。例如,`10z`可能涉及到异常处理,展示try-catch-finally结构的使用。`6z`可能是一个多线程示例,解释了如何创建和...
Java 提供了强大的多线程支持和内存管理机制,这使得开发者能够高效地管理游戏中的各种资源和逻辑,如单位的移动、资源采集、建筑建造等。 ### 2. StarCraft Ⅰ 游戏介绍及特点 #### 2.1 游戏背景简介 《星际争霸...
在Java编程语言中实现这样的专家系统,首先需要对Java基础扎实,包括类、对象、接口、异常处理、多线程等核心概念。此外,理解面向对象设计原则和模式,如单一职责、开闭原则、依赖倒置等,有助于构建可扩展和维护的...
为了提高游戏性能和用户体验,还可以考虑使用多线程技术来处理网络请求,以实现更高效的并发处理能力。 #### 游戏逻辑设计 游戏逻辑是决定游戏玩法和体验的核心因素。对于格斗游戏而言,需要设计角色的攻击、防御等...
3. **多线程编程**:为了提高游戏性能,可能会使用多线程来处理不同的任务,如游戏逻辑计算、网络通信、AI计算等。 4. **图形处理**:利用Java的AWT/Swing或者更高级的JavaFX进行图形界面的开发。此外,如果涉及到3D...
总结,Java学习涉及广泛的主题,从基本语法到高级特性,如多线程、网络编程和数据库交互。理解并熟练掌握这些概念是成为Java开发者的基石。在复习过程中,应注重实践,通过编写代码加深理解,同时遵循良好的编程规范...
3. **Java栈**:每个线程拥有自己的Java栈,存储线程的局部变量、操作数栈、动态链接等信息。 4. **程序计数器**:记录当前线程所执行的字节码指令地址。 5. **本地方法栈**:用于支持本地方法调用的栈。 这些组成...