`
shixiaomu
  • 浏览: 383836 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java 多线程 心得 体会

    博客分类:
  • java
阅读更多
点解 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编程语言中一个非常重要的概念,它允许开发者在一个程序中创建多个执行线程并行运行,以提高程序的执行效率和响应速度。在Java中,线程的生命周期包含五个基本状态,分别是新建状态(New)、就绪...

    Java 多线程学习总结归纳(附代码)

    Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,从而提升系统效率。在Java中,实现多线程主要有两种方式:继承Thread类和实现Runnable接口。下面是对Java多线程学习的详细解析。 1. **多线程概述*...

    java学习心得体会

    在并发编程方面,Java提供了线程和进程的概念,理解线程同步和互斥、死锁以及如何使用synchronized关键字和wait/notify机制来控制并发行为,是编写高效多线程程序的基础。 最后,Java标准库(JDK)提供了大量的类和...

    Java线程学习和总结

    在Java编程语言中,线程是程序执行的基本单元,它允许程序并发地执行多个任务。本文将深入探讨Java线程的核心概念、API以及在实际开发中的应用,旨在帮助你理解和掌握这一关键技能。 首先,我们需要了解什么是线程...

    java实训的心得体会.docx

    此外,学习者还可以学习到 Java 语言的高级特性,如多线程编程、网络编程、数据库编程等。 在实训中,学习者还可以学习到如何设计和实现一个完整的项目,如何分工合作,如何解决项目中遇到的问题等。这些经验和技能...

    Java日记-我的学习心得

    本文将基于一篇关于Java多线程的学习心得文章,深入探讨Java中的多线程概念、原理及其实际应用。 #### 二、Java多线程基础 Java提供了内置的支持来简化多线程编程的过程。这主要体现在以下几个方面: 1. **语言...

    java开发实习心得体会.pdf

    Java开发实习心得体会 Java是一种广泛应用的编程语言,在软件开发中的重要性不言而喻。本文档记录了作者在四川实习的一些心得体会,通过实习,作者不仅掌握了Java语言的基本概念和编程技巧,还提高了自己的实践能力...

    2022学习java心得体会(精选5篇)_java心得体会.docx

    第一篇 java7 学习心得体会,总结了java7 的主要学问点,包括基本语法、类和对象、内部类、匿名类、抽象类、接口、包、输入输出、SWT 各中界面、事务监听和处理、异样处理和多线程等。第二篇 DJ JAVA 软件学习心得...

    多线程实验报告.docx

    在本实验中,我们主要探讨的是Java编程中的多线程技术及其在实际应用中的实现。...总的来说,这个多线程实验旨在让学生通过实际操作,加深对Java多线程编程的理解,提高编程技能,并锻炼解决问题的能力。

    JAVA做完项目心得

    5. **多线程**:为了提升程序的并发性能,我接触了Java的多线程编程。通过实现Runnable接口或继承Thread类,我学会了如何创建和管理多个执行线程,理解了同步和互斥的概念,以及synchronized关键字的应用。 6. **...

    2022年java实训心得体会范文.docx

    【Java实训心得体会】 Java实训是计算机科学特别是软件工程专业学生必不可少的一部分,它是理论知识与实践操作相结合的关键步骤。通过2022年的Java实训,学生深入理解了Java编程语言的核心概念,增强了动手能力和...

    java培训班心得体会___五篇.docx

    在这篇文章中,我将分享我在学习Java编程过程中的心得体会,以及一些关键知识点的理解,希望能够帮助到同样对Java感兴趣的朋友们。 首先,Java培训班的学习之旅是从PTA作业开始的。在一开始,我被要求完成一系列的...

    学习java的心得体会 (2).docx

    学习 Java 的心得体会 学习 Java 需要具备良好的心态和习惯,以下是学习 Java 的心得体会: 一、充分利用 MSDN MSDN 是 Microsoft 当前提供的有关编程信息的最全面的资源,包含微软最新的技术数据库,加上易学...

    2022年Java工程师培训心得体会范文.docx

    比如,学习Java时,应该先掌握基本语法、面向对象编程(OOP)的概念,然后再逐渐接触到更高级的主题,如集合框架、异常处理、多线程编程等。此外,阅读经典书籍如《Java编程思想》是非常重要的,这有助于理解语言背后...

    关于C语言的心得体会

    学习C语言的过程中,我深深体会到其精髓不仅在于掌握语言规则,更在于理解程序设计的基本原理和思维方式。 C语言的核心特性包括丰富的数据类型、强大的运算符集合、简洁的语法结构以及直接访问硬件的能力。数据类型...

    2022年java学习心得体会例文.docx

    Java学习心得体会 Java作为一种广泛应用的编程语言,其学习过程涵盖了多个方面。首先,学习Java需要遵循一定的步骤,从基础知识开始,逐步深入。Java的基础包括数据类型、方法、类、变量和常量等基本元素。理解并...

    线程的使用心得

    - 在多线程环境中,合理使用`Thread.sleep()`可以避免某些竞争条件,例如在循环中检查某个条件是否满足时,适当延迟可以降低CPU负载。 #### 5. 示例代码分析 ```java public class TextThread { public static ...

    飞机大战_MoAC

    总结来说,"飞机大战_MoAC"项目为我们提供了一个实践Java多线程和事件监听器的好例子。通过这个项目,我们可以学习如何构建一个多线程的游戏环境,以及如何通过键盘和按钮监听器来增强游戏的互动性。这样的实战经验...

    2022年java学习心得体会.docx

    首先,对于多线程的管理,Java提供了`join()`方法来确保线程的执行顺序。例如,如果希望线程T2在T1执行完毕后执行,T3在T2执行完毕后执行,可以使用T1.join(), T2.join()来实现。这允许线程按照预定的顺序等待其他...

Global site tag (gtag.js) - Google Analytics