Java线程初探
最近一段时间初学了一些java线程,写些体会,供大家一起交流学习。之前,一直都是编写单线程java程序,现在,初步学习线程,实现多线程的编写。
线程是程序中一个单一的顺序控制流程,而进程是指一个内存中运行的应用程序。每个进程都有自己独立的一块内存空间,可以启动多个线程,这些多线程共享进程的内存。多线程的执行是并发的,也就是在逻辑上的同时。
简单了解些线程的状态。线程对象一旦被创建后,就进入初始状态。当该对象调用start方法,就进入可运行状态。此后,当该对象被操作系统选中,获得CPU时间片就会进入运行状态。关于可运行状态和运行状态,就好比短跑中,一个是预备跑状态,一个是开跑以后状态。一个是具备了条件但没有去做,一个是已经做开了。进入运行状态后就可能会出现以下多种情况:
(1)如果run方法或main方法结束,则线程进入终止状态。
(2)如果线程调用了自身的sleep方法或其他线程的join方法,就会进入阻塞状态。当此方法结束后,该线程进入可运行状态,继续等待操作系统分配时间片。
(3)如果线程调用了yield方法,回到可运行状态,这时与其他线程处于同等竞争状态,操作系统有可能会接着又让这个线程进入运行状态。
(4)当线程刚进入可运行状态时,发现将要调用的资源被同步,获取不到锁标记,将会立即进入锁池状态,等待获取锁标记。一旦线程获得锁标记后,就转入可运行状态,等待操作系统分配CPU时间片。
(5)如果线程调用wait方法,会进入等待队列,进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify或notifyAll方法才能被唤醒,线程被唤醒后进入锁池,等待获取锁标记。
对于(4),(5)看不懂的不要急,它们涉及到多线程的同步,后面会讲。(这里穿插介绍一个isAlive方法,用来判断线程是在运行中还是已经终止。具体运用见下图:
public static void main(String[] args) { Judge test1=new Judge(1000,"test1"); test1.start(); Judge test2=new Judge(2000,"test2"); test2.start(); System.out.println(test1.isAlive()?"运行中":"已经终止"); System.out.println(test2.isAlive()?"运行中":"已经终止"); try { Thread.sleep(10000); } catch (InterruptedException e) { System.out.println(e); } System.out.println(test1.isAlive()?"运行中":"已经终止"); System.out.println(test2.isAlive()?"运行中":"已经终止"); }
)
现在再肤浅的认识一下线程优先级。java给每个线程安排优先级以决定与其他线程比较时该如何对待该线程。线程优先级是详细说明线程间优先关系的整数。作为绝对值,优先级毫无意义的;当只有一个线程时。优先级高的线程并不比优先级低的线程运行得快。相反,线程的优先级是用来决定何时从一个运行的线程切换到另一个,叫做上下文转换。决定上下文转换发生的规则:1>.线程可以自动放弃控制。在I/O未决定的情况下,睡眠或阻塞由明确的让步来完成。在这种假定下,所有其他的线程被检测,准备运行的最高优先级线程被授予CPU。2>.线程可以被高优先级的线程抢占。在这种情况下,虽然低优先级线程不主动放弃,但是无论处理器正在干什么,它都会被高优先级的线程占据。基本上,一旦高优先级线程要运行,它就执行,这叫做有优先级的多任务处理,具体代码如下:
package 线程优先级; public class MyRunnable implements Runnable{ public void run() { for(int i=0;i<10;i++){ System.out.println("线程2第"+i+"次执行"); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }
package 线程优先级; public class MyThread1 extends Thread { public void run() { for(int i=0;i<10;i++){ System.out.println("线程1第"+i+"次执行"); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
package 线程优先级; public class Priority { public static void main(String[] args) { Thread test1 = new MyThread1(); Thread test2 = new Thread(new MyRunnable()); // 创建了两个线程test1和test2,并且分别为其设置了优先级为10和1 test1.setPriority(10); test2.setPriority(1); test1.start(); test2.start(); } }
由于前面相应例子已经有关于多线程的实现,这里就简单提一下。第一种:继承Thread类,Thread类有两种构造方法:public Thread(),public Thread(Runnable r)(参数r成为被创建的目标对象。这个目标必须实现Runnable接口,给出该接口的run()方法的方法体,在方法体中实现操作),这种方式需要作为一个线程执行的类只能继承,扩充单一的父类;第二种:实现Runnable接口,它打破了扩充Thread类方式的限制。如果有一个类,它已继承了某个类,又想实现多线程,那就可以通过实现Runnable接口来创建线程。
(注:本文资源来源于清华大学出版社的《高级程序设计语言(Java版)》,无任何商业目的,只是交流学习。)
相关推荐
Java语言自问世以来就以其独特的特性和优势吸引了大量开发者的注意,这些特性包括但不限于其平台独立性、内存管理优化、面向对象的编程设计以及其强大的多线程支持。 首先,Java语言的平台独立性是指它能够跨不同...
线程初探总结 在本章中,我们探讨了多线程编程的基础知识,包括进程和线程的概念、Java对多线程的支持、第一个多线程程序等。下一章,我们将深入探讨多线程编程的高级技术和实践经验。 多线程编程的应用 多线程...
对于并发编程,Java提供了丰富的线程API,包括Thread类和Runnable接口,以及ExecutorService和Future等高级并发工具。通过合理使用这些工具,开发者可以编写出高效并行运行的程序,充分利用多核处理器的优势。 在...
Java语言是一种跨平台、分布式、面向对象、多线程适用于网络应用的现代高级编程语言。它始创于1995年,由美国的Sun公司创建。在网络应用和手机应用方面,Java语言有了更广泛的应用,因此,在各高校都已开设了Java...
这篇"基于游戏开发的Java语言教学初探"主题探讨了如何将Java语言的学习与游戏开发相结合,以提高学生的学习兴趣和编程技能。游戏开发是一个综合性的过程,涉及到图形渲染、物理模拟、人工智能、网络通信等多个方面,...
创建Java线程有多种方式,其中最常用的是继承Thread类和实现Runnable接口。多线程的实现能够将一个大任务分解为多个小任务,并行处理,这样可以充分利用计算资源,达到更快的执行速度。在并发编程中,线程之间共享...
Java高级编程课程思政案例教学初探,是一个深入探讨如何将思想政治教育融入到Java高级编程教学中的主题。在当前的教育环境中,强调立德树人,将思政元素与专业课程相结合,旨在培养具备良好品德和社会责任感的IT人才...
Java在线开放课程建设初探,这是一个关于如何构建和优化Java教育平台的主题,旨在分享和探讨在互联网时代如何有效地提供高质量的编程教育资源。本课程的构建不仅涵盖了技术层面的实现,还包括了教学方法、课程设计...
### IBM之Java性能诊断工具初探—IBM Support Assistant的使用 #### 一、引言 随着信息技术的飞速发展,企业级应用系统变得越来越复杂,性能优化成为了保证系统高效稳定运行的关键因素之一。Java作为跨平台的语言...
【初探Java FX:构建小系统企业员工系统】 Java FX是一个强大的、用于创建桌面应用程序的图形用户界面(GUI)框架,它提供了丰富的视觉组件和高度定制的样式,使得开发者能够构建出美观且功能丰富的应用程序。在...
全书共20章,分为4篇进行介绍,第1篇为基础篇,包括Java开发前奏、搭建Java开发环境、 扎实Java语言基本语法、掌握算法和流程控制、使用Eclipse开发工具、探秘面向对象程序设计、初探Java数组;第2篇为核心篇,包括...
【初探JVM内存区域】 Java虚拟机(JVM)是Java编程语言的核心组成部分,它为Java应用程序提供了运行环境。理解JVM内存区域对于优化Java应用性能至关重要。本篇文章将详细探讨JVM中的主要内存区域及其作用。 1. **...
这些项目不仅涵盖了Java的基础语法,还涉及面向对象编程、异常处理、多线程、I/O流等核心概念。 首先,项目开始阶段,教师应引导学生分析项目需求,明确项目目标,这有助于学生理解为什么要学习特定的Java知识。...
2. **第二章 - Java初探** 这一章将引导读者了解Java的历史、特点和应用领域。会讲解Java的“一次编写,到处运行”的跨平台特性,以及其面向对象编程的基础。可能会包含如何安装Java开发环境(JDK)和编写第一个...
通过阅读《Netty初探:掌握高性能网络通信框架,提升Java网络编程技能》这本书,你将深入了解这些概念,并学会如何运用Netty构建实际的网络应用,提升你的Java编程技能。这本书会逐步引导你从基础知识到高级特性的...
例如,我们可以使用AbstractRoutingDataSource,这是一个可以根据上下文(如环境变量、线程绑定的属性等)动态选择数据源的FactoryBean。这在多环境部署或复杂分布式系统中非常有用。 在实际开发中,理解Spring AOP...
Java编程老鸟潜心写作,奉献高效率的Java学习心得 完全站在没有编程经验读者的角度,手把手教会读者学习Java 配16小时多媒体教学视频,高效、直观 一一击破Java入门可能会遇到的难点和疑惑 抽丝剥茧,层层推进,让...
Java编程老鸟潜心写作,奉献高效率的Java学习心得 完全站在没有编程经验读者的角度,手把手教会读者学习Java 配16小时多媒体教学视频,高效、直观 一一击破Java入门可能会遇到的难点和疑惑 抽丝剥茧,层层推进,让...
《飞机大战Java源代码解析与游戏开发初探》 在编程世界中,Java以其跨平台性和丰富的类库深受开发者喜爱,尤其在游戏开发领域,Java也有着广泛的应用。本篇文章将详细解读“飞机大战Java源代码”,并针对游戏开发中...