点解 java 多线程..
先说相关的名词:
Thread Runable wait notify notifyAll join lock synchronized util.concurrent volatile Daemon
名词解释:
守护线程 ,又称精灵线程(Daemon Thread)
非守护线程,又称用户线程(User Thread)
用个比较通俗的比如,任何一个守护线程都是整个JVM中所有非守护线程的保姆:只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。
线程肯定都是在一个进程内,共享一个进程的内存.我对一个进程简单理解就是"一个main启动的还没有执行完毕的暂时状态"
jvm 内存模型 . 多线程并发 保证 可见性 有序性.
对象锁 类锁 方法锁 代码块锁 整体锁
synchronized (this) 当前对象为锁
在并发环境下,解决共享资源冲突问题时,可以考虑使用锁机制
理论上,每个对象都可以做为锁,但一个对象做为锁时,应该被多个线程共享,这样才显得有意义,在并发环境下,一个没有共享的对象作为锁是没有意义的(结合单例模式)
生产者/消费者模式其实是一种很经典的线程同步模型,很多时候,并不是光保证多个线程对某共享资源操作的互斥性就够了,往往多个线程之间都是有协作的。
wait方法是从Object来的,所以任意对象都有这个方法
如果一个线程获得了锁lock,进入了同步块,执行lock.wait(),那么这个线程会进入到lock的阻塞队列。如果调用lock.notify()则会通知阻塞队列的某个线程进入就绪队列。
volatile是java提供的一种同步手段,只不过它是轻量级的同步,为什么这么说,因为volatile只能保证多线程的内存可见性,不能保证多线程的执行有序性。而最彻底的同步要保证有序性和可见性,例如synchronized。任何被volatile修饰的变量,都不拷贝副本到工作内存,任何修改都及时写在主存。
volatile只保证了可见性,所以Volatile适合直接赋值的场景
join 联合 等所有线程执行完毕以后再往下走.
以下是一个多线程生产消费的例子
public class PlateFactory {
private static Plate plate;
public static Plate createPlate() {
if (plate == null) {
plate = new Plate();
}
return plate;
}
}
import java.util.ArrayList;
import java.util.List;
public class Plate {
public List eggs = new ArrayList();
public synchronized Object getEgg() {
if (eggs.size() == 0) {
try {
System.out.println("取线程判断集合为空,等待");
wait();
} catch (InterruptedException e) {
}
}
Object egg = eggs.get(0);
eggs.clear();// 清空盘子
notify();// 唤醒阻塞队列的某线程到就绪队列
return egg;
}
public synchronized void putEgg(Object egg) {
if (eggs.size() > 0) {
try {
System.out.println("放线程判断集合size大于0,等待");
wait();
} catch (InterruptedException e) {
}
}
eggs.add(egg);// 往盘子里放鸡蛋
notify();// 唤醒阻塞队列的某线程到就绪队列
}
}
public class client {
public static void main(String[] args) {
Plate plate =PlateFactory.createPlate();
System.out.println("放客户端盘子对象"+plate);
// for (int i = 0; i < 10; i++) {
Thread b =new Thread(new putThread(plate));
b.start();
Thread a =new Thread(new getThread(plate));
a.start();
// }
}
}
class putThread implements Runnable {
Plate plate;
public putThread(Plate plate){
this.plate = plate;
}
public void run() {
while(true){
Object obj = new Object();
System.out.println("放入"+obj);
plate.putEgg(obj);
try {
Thread.sleep(20000L);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class getThread implements Runnable {
Plate plate ;
public getThread(Plate plate){
this.plate = plate;
}
public void run() {
while(true){
//System.out.println("取出线程开始");
Object obj = plate.getEgg();
System.out.println("取出"+obj);
try {
Thread.sleep(20000L);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
分享到:
相关推荐
Java多线程是Java编程语言中一个非常重要的概念,它允许开发者在一个程序中创建多个执行线程并行运行,以提高程序的执行效率和响应速度。在Java中,线程的生命周期包含五个基本状态,分别是新建状态(New)、就绪...
Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,从而提升系统效率。在Java中,实现多线程主要有两种方式:继承Thread类和实现Runnable接口。下面是对Java多线程学习的详细解析。 1. **多线程概述*...
在并发编程方面,Java提供了线程和进程的概念,理解线程同步和互斥、死锁以及如何使用synchronized关键字和wait/notify机制来控制并发行为,是编写高效多线程程序的基础。 最后,Java标准库(JDK)提供了大量的类和...
在Java编程语言中,线程是程序执行的基本单元,它允许程序并发地执行多个任务。本文将深入探讨Java线程的核心概念、API以及在实际开发中的应用,旨在帮助你理解和掌握这一关键技能。 首先,我们需要了解什么是线程...
此外,学习者还可以学习到 Java 语言的高级特性,如多线程编程、网络编程、数据库编程等。 在实训中,学习者还可以学习到如何设计和实现一个完整的项目,如何分工合作,如何解决项目中遇到的问题等。这些经验和技能...
本文将基于一篇关于Java多线程的学习心得文章,深入探讨Java中的多线程概念、原理及其实际应用。 #### 二、Java多线程基础 Java提供了内置的支持来简化多线程编程的过程。这主要体现在以下几个方面: 1. **语言...
Java开发实习心得体会 Java是一种广泛应用的编程语言,在软件开发中的重要性不言而喻。本文档记录了作者在四川实习的一些心得体会,通过实习,作者不仅掌握了Java语言的基本概念和编程技巧,还提高了自己的实践能力...
第一篇 java7 学习心得体会,总结了java7 的主要学问点,包括基本语法、类和对象、内部类、匿名类、抽象类、接口、包、输入输出、SWT 各中界面、事务监听和处理、异样处理和多线程等。第二篇 DJ JAVA 软件学习心得...
Java 培训班心得体会的分享揭示了学习Java编程的过程和关键知识点。首先,通过PTA作业的训练,学习者逐渐掌握了Java的基本语法、类型、输入输出操作、方法的使用和面向对象编程的概念。在作业的迭代中,从简单的语法...
在本实验中,我们主要探讨的是Java编程中的多线程技术及其在实际应用中的实现。...总的来说,这个多线程实验旨在让学生通过实际操作,加深对Java多线程编程的理解,提高编程技能,并锻炼解决问题的能力。
5. **多线程**:为了提升程序的并发性能,我接触了Java的多线程编程。通过实现Runnable接口或继承Thread类,我学会了如何创建和管理多个执行线程,理解了同步和互斥的概念,以及synchronized关键字的应用。 6. **...
【Java实训心得体会】 Java实训是计算机科学特别是软件工程专业学生必不可少的一部分,它是理论知识与实践操作相结合的关键步骤。通过2022年的Java实训,学生深入理解了Java编程语言的核心概念,增强了动手能力和...
学习 Java 的心得体会 学习 Java 需要具备良好的心态和习惯,以下是学习 Java 的心得体会: 一、充分利用 MSDN MSDN 是 Microsoft 当前提供的有关编程信息的最全面的资源,包含微软最新的技术数据库,加上易学...
比如,学习Java时,应该先掌握基本语法、面向对象编程(OOP)的概念,然后再逐渐接触到更高级的主题,如集合框架、异常处理、多线程编程等。此外,阅读经典书籍如《Java编程思想》是非常重要的,这有助于理解语言背后...
学习C语言的过程中,我深深体会到其精髓不仅在于掌握语言规则,更在于理解程序设计的基本原理和思维方式。 C语言的核心特性包括丰富的数据类型、强大的运算符集合、简洁的语法结构以及直接访问硬件的能力。数据类型...
Java学习心得体会 Java作为一种广泛应用的编程语言,其学习过程涵盖了多个方面。首先,学习Java需要遵循一定的步骤,从基础知识开始,逐步深入。Java的基础包括数据类型、方法、类、变量和常量等基本元素。理解并...
- 在多线程环境中,合理使用`Thread.sleep()`可以避免某些竞争条件,例如在循环中检查某个条件是否满足时,适当延迟可以降低CPU负载。 #### 5. 示例代码分析 ```java public class TextThread { public static ...
总结来说,"飞机大战_MoAC"项目为我们提供了一个实践Java多线程和事件监听器的好例子。通过这个项目,我们可以学习如何构建一个多线程的游戏环境,以及如何通过键盘和按钮监听器来增强游戏的互动性。这样的实战经验...
首先,对于多线程的管理,Java提供了`join()`方法来确保线程的执行顺序。例如,如果希望线程T2在T1执行完毕后执行,T3在T2执行完毕后执行,可以使用T1.join(), T2.join()来实现。这允许线程按照预定的顺序等待其他...