一、在Java中有两种方法实现多线程:
继承Thread类和实现Runnable接口。
实现Runnable接口对于继承Thread接口有如下显著优势:
1、 适合多个相同程序代码的线程去处理同一资源,因为可以只建一个对象,然后new Thread()多次实现多线程,这样资源就是共享的
2、 可以避免Java的单继承带来的局限
3、 增强了程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。
所以尽量使用Runnable
二、线程的状态
1、 创建状态:有了相应的内存空间和其他资源,但还处于不可运行状态
2、 就绪状态:调用start()方法就进入就绪状态,线程将进入线程队列排队,等待CPU服务
3、 运行状态:获得CPU资源时,自动调用run()方法
4、 堵塞状态:一个正在执行的线程在某些特殊的情况下,如被认为挂起或需要执行耗时的输入输出操作,将让出CPU并暂时中止自己的执行,进入堵塞状态。在可执行状态下,如果调用sleep()、suspend()、wait()等方法,线程将进入堵塞状态。堵塞时线程不能进入排队队列,只有引起堵塞的原因消除后,才能重新进入就绪状态。
5、 死亡状态:线程调用stop()方法或者run()方法执行结束后。
三、线程操作的相关方法:
在Java中多有的贤臣个都是同时启动的,主方法实际上也是一个线程。
1、取得和设置线程名字:getName() setName()
2、判断线程是否启动:isAlive()
3、线程的强制运行:join() 强制运行期间,其他线程无法运行,必须等待此线程完成之后才可以继续执行。
4、线程的休眠:Thread.sleep();休眠时不进入排队队列
5、中断线程:interrupt()
6、后台线程:在Java程序中只要前台有一个程序在运行,整个Java程序进程都不会消失,所以此时可以设置一个后台线程,这样即使Java进程结束了,此后太线程依然会继续执行。要想实现这样操作,直接使用setDaemon()方法即可。
如果出了这个后台线程别的线程都执行完了Java程序就会结束了。
6、 线程的优先级:setPriority()
不过并非线程的优先级越高就一定会先执行,哪个线程先执行将有CPU的调度来决定。
7、 线程的礼让:yield()方法将一个线程的操作暂时让给其他线程执行。
四、同步与死锁:
1、同步
问题的引出:
【 知识条:java的内存模型是对每一个进程有一个主内存, 每个线程有自己的内存, 他们从主内存中取数据, 然后计算, 再存入主内存中。
】
一个多线程的程序如果通过Runnable接口实现,则意味着类中的属性将被多个线程共享,那么这样一来就会造成一种问题,如果这多个线程要操作同一资源就有可能出现资源的同步问题。
问题的解决:引入同步的概念:就是指多个操作在同一时间段内只能有一个线程进行,其他线程要等待此线程完成之后才可以继续执行。
【知识条:JAVA中规定对非DOUBLE, LONG的原始类型的取和存操作为原子操作。 其实就是对一个字(32位)的取,存位原始操作, 因为DOUBLE, LONG为两个字节的长度, 所以其取, 存为非原子操作。 如果想把他们也变为原子操作, 可以用VOLATILE关键字来修饰
】
需要明确的几个问题:
1)synchronized关键字可以作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块。如果再细的分类,synchronized可作用于instance变量、object reference(对象引用)、static函数和class literals(类名称字面常量)身上。
2)无论synchronized关键字加在方法上还是对象上,它取得的锁都是对象,而不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的对象访问。
3)每个对象只有一个锁(lock)与之相关联。
4)实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。
使用同步解决问题:解决资源共享的同步操作,可以使用同步代码块(synchronized(同步对象){需要同步的代码;})和金额同步方法(用关键字synchronized将一个方法声明为同步方法)两种方式完成。
2、死锁:
问题引出:过多的同步也会产生死锁问题,死锁就是指两个线程都在等待彼此先完成,造成了程序的停滞。
五、线程操作案例——生产者与消费者(咱略)
六、线程的生命周期
Stop() suspend() resume() 方法已不推荐使用,容易出现死锁。所以可以通过标签实现暂停重新开始和停止。
P:详细参考:《Java 开发实战经典》李兴华
分享到:
相关推荐
5. **定时任务与线程**:为了在指定时间点弹出提醒,可能使用了java.util.Timer和TimerTask类来安排未来执行的任务。这允许程序在后台运行,即使用户没有与界面交互,也能在预定时间触发提醒。 6. **数据存储**:...
Java开发备忘录是程序员在进行Java编程时的重要...以上仅是Java开发备忘录中的部分核心概念,实际备忘录可能还包括更具体的API使用、最佳实践、设计模式等内容。学习和掌握这些知识,对于提升Java开发能力至关重要。
在本项目中,我们讨论的是一个使用Java编程语言与MySQL数据库进行开发的备忘录系统。这个系统的主要目标是提供一套便捷的工具,让用户能够轻松地管理他们的日常事务,包括创建、编辑、查找和删除备忘录。同时,系统...
Java备忘录是一款基于Java编程语言开发的简单应用程序,它主要功能是对数据进行增、删、改、查操作。在这款应用中,开发者选择使用了HashMap作为核心数据结构来存储和管理数据。HashMap是Java集合框架中的一员,属于...
此外,为了保证数据持久性,程序可能还需要集成文件I/O操作,例如使用`java.io`包中的类进行读写操作,将备忘录数据保存到文本文件。 接下来,我们转向学生系统的设计。一个典型的学生管理系统通常包含学生信息管理...
2. **线程状态**:Java线程有五种状态,包括新建、就绪、运行、阻塞和终止。理解这些状态有助于优化线程的使用。 3. **线程同步**:为了防止多个线程同时访问共享资源,Java提供了多种同步机制,如`synchronized`...
Java 内存结构备忘录 Java 内存结构是一个复杂的系统,包括堆内存模型、垃圾回收算法和处理内存泄露的最佳方案。Java 虚拟机(JVM)中存在 PermGen(内存永久保存区域), PermGen 中存储了常量池、字段与方法数据...
【标题】:“小小工具箱-(备忘录,日历,倒计时)(java源代码)”揭示了这是一个基于Java编程语言开发的多功能小型应用。这个应用集成了三种常见且实用的功能,分别是倒计时、日历以及备忘录。开发者通过Java技术...
在电子备忘录的Java基础知识综合实例中,我们主要探讨的是如何使用Java语言来构建一个图形用户界面(GUI)的应用程序。GUI是用户与计算机进行交互的重要方式,它通过按钮、文本框、菜单等可视化元素使得操作更加直观...
总的来说,这个Java抢票提醒应用结合了Java的IO操作、多线程、XML处理以及可能的GUI和网络编程技术,为用户提供了一个功能完善的备忘录和提醒工具。其设计考虑了易用性和实用性,使得用户能够方便快捷地管理他们的...
在Java编程领域,设计模式和多线程设计模式是开发者必备的技能。设计模式是一种在特定情境下解决软件设计问题的通用、可复用的解决方案,而多线程设计模式则是处理并发问题的关键。本文将深入探讨这两种重要的概念,...
备忘录的提醒功能是通过Java的线程机制实现的。线程允许程序同时执行多个任务,例如,主线程可以负责用户界面的交互,而另一个线程则专门负责检查提醒时间。当设定的提醒时间到达时,线程会触发提醒事件,可以是桌面...
这个备忘录应用程序使用了Java Swing库来构建用户界面,允许用户进行交互。以下是代码中涉及的关键知识点: 1. **JFrame**: `Memorial` 类继承自 `JFrame`,这是Java Swing中的一个顶级容器,用于创建窗口应用程序...
Java作为一门广泛使用的编程语言,其面试题涵盖了多个核心领域,包括线程、集合和设计模式。这些主题在软件开发中至关重要,理解并熟练掌握它们是成为优秀Java开发者的关键。 线程是Java并发编程的基础,它允许多个...
2. Java或Kotlin:作为编程语言,Kotlin是Google推荐的首选语言,但Java也是广泛使用的选项。 3. SQLite数据库:用于存储备忘数据。 4. Material Design:遵循Google的设计指南,提供良好的用户体验。 5. ...
Java 和 Android 面试备忘单包含了这两个领域中最重要的知识点和常见面试问题。下面将对这些关键概念进行深入解析。 一、Java 基础 1. **数据类型**:Java 分为基本数据类型(如 int, char, boolean)和引用数据...
Java是一种广泛使用的面向对象的编程语言,其基础知识涵盖了多个方面,包括语法、面向对象特性、异常处理、多线程、I/O流、网络编程、反射技术、设计模式以及JVM等核心概念。以下是对这些知识点的详细说明: 一、...
以下是一个简单的Java NIO服务器示例,展示了如何使用Selector处理连接请求: ```java public class NBTest { public void startServer() throws Exception { // 创建选择器 Selector selector = Selector.open...
#### 二、Java线程管理 Java中的线程管理由JVM(Java虚拟机)线程调度器负责。线程是程序执行的基本单位,多个线程可以在同一进程中并发执行。 - **线程调度**:JVM根据一定的策略来调度线程,确保它们能够公平地...
它可能使用Android的布局文件(XML)来定义UI元素,如EditText(文本输入框)用于输入备忘内容,ListView或RecyclerView用于展示备忘列表。同时,MainActivity中的Java代码会处理用户的交互事件,如点击事件,以及...