java多线程的理解

 

线程的5种状态:新建,就绪,运行,阻塞,死亡。

Thread.sleep:线程  运行状态 转为  阻塞状态,(其它线程启动运行)

Thread.yield:   线程 运行状态 转为 就绪状态,(同优先级线程启动运行)

ThreadA.join:等待ThreadA执行完成。

线程的两种方式:

继承自Thread,实现Runnable.

在线程中看是否有操作的同一对象的实例。如果有的话要考虑线程的同步和互斥。通俗点来说就是某个类的某个成员变量会有多个线程访问。

线程的同步:

同步代码块:同步加锁的是对象,而不是代码。

synchronized(Object A){

}

同步监视器是A,表示的是一个临界区。

同步方法:

synchronized Method1(){

}

synchronized Method2(){

}

同步锁:

Lock lock = new ReentrantLock();

public Mehtod1(){

lock.lock();

finally{

lock.unlock();

}

}

public Mehtod2(){

lock.lock();

finally{

lock.unlock();

}

}

同步监视器的释放:

1.当前线程的同步方法或者同步代码块执行结束,当前线程即释放同步监视器。

2.在同步方法或者同步代码块中出现了error或者exception的时候。

3.当线程执行同步方法或者同步代码块时,程序执行了同步监视器对象的wait方法,则当前线程,并释放同步监视器。

下面的情况不会释放同步监视器:

1.当线程执行同步方法或者同步代码块时,程序调用Thread.Sleep,Thread.Yield方法。

2.当线程执行同步方法或者同步代码块时,其他线程调用了该线程的suspend方法将该线程挂起。

线程的通信:

同步方法块或者同步方法使用object的wait,notify和notifyAll三个方法来进行线程的通信。

如果是同步方法块synchronized(Object a):则在代码中要使用a.wait,a.notify,a.notifyAll;

如果使用的是同步方法synchronized methodA(),则同步监视器是this对象,可以直接在代码中使用wait,notify和notifyAll方法。

wait:导致当前的线程等待,并且释放当前的同步监视器。直到其他线程调用该同步监视器的notify方法和notifyall方法。

notify:唤醒在此监视器上等待的单个线程,但是选择是任意的。

notifyAll:唤醒在同步监视器上等待的所有线程。

java多线程的理解的更多相关文章

  1. (转载)Java多线程入门理解

    转载出处http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更 ...

  2. synchronized与static synchronized 的差别、synchronized在JVM底层的实现原理及Java多线程锁理解

    本Blog分为例如以下部分: 第一部分:synchronized与static synchronized 的差别 第二部分:JVM底层又是怎样实现synchronized的 第三部分:Java多线程锁 ...

  3. 温故知新-java多线程&深入理解线程池

    文章目录 摘要 java中的线程 java中的线程池 线程池技术 线程池的实现原理 简述 ThreadPoolExecutor是如何运行的? 线程池运行的状态和线程数量 任务执行机制 队列缓存 Wor ...

  4. 谈谈你对Java多线程的理解以及多线程的实现方式

    说线程之前先说进程,何为进程?进程就是正在进行中的程序.比如电脑同时在运行QQ进程.cmd进程.wps进程.飞秋进程等.在某一时刻,CPU只能执行一个程序,只是在做快速切换,我们肉眼看不出来. 比如: ...

  5. Java多线程深入理解

    在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口. 对于直接继承Thread的类来说,代码大致框架是: ? 1 2 3 4 5 6 7 8 9 10 ...

  6. Java多线程的理解和实例

    编写具有多线程程序经常会用到的方法:run(), start(), wait(), notify(), notifyAll(), sleep(), yield(), join() 还有一个关键字:sy ...

  7. Java多线程 -- 深入理解JMM(Java内存模型) --(五)锁

    锁的释放-获取建立的happens before 关系 锁是Java并发编程中最重要的同步机制.锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息. 下面是锁释放-获取的示例代 ...

  8. 从JAVA多线程理解到集群分布式和网络设计的浅析

    对于JAVA多线程的应用非常广泛,现在的系统没有多线程几乎什么也做不了,很多时候我们在何种场合如何应用多线程成为一种首先需要选择的问题,另外关于java多线程的知识也是非常的多,本文中先介绍和说明一些 ...

  9. 关于java多线程中异常捕获的理解

    在java多线程程序中,所有线程都不允许抛出未捕获的checked exception(比如sleep时的InterruptedException),也就是说各个线程需要自己把自己的checked e ...

随机推荐

  1. 【一天一道LeetCode】#344. Reverse String

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Write a ...

  2. Docker教程:镜像构建和自动镜像构建dockerfile

    http://blog.csdn.net/pipisorry/article/details/50805379 Docker透过Dockerfile来记录建立Container映象文件的每一个步骤,可 ...

  3. .NET 连接SQL Server2012遇到的连接出错问题解析

    最近在用VS2013编写相关于SQL Server数据库的代码,但是却遇到了艰难的bug问题,那就是在进行连接的时候出现了各种异常. 出错分析 1.首先应该想到的是数据库的相关服务没有开启. 因为默认 ...

  4. redis3.0.5在linux上安装与配置

    redis3.0.5在linux上安装与配置 rhel6/ubuntu14 1 下载 # wget http://download.redis.io/releases/redis-3.0.5.tar. ...

  5. 【Android 系统开发】Android JNI 之 JNIEnv 解析

    . jni.h文件 : 了解 JNI 需要配合 jni.h 文件, jni.h 是 Google NDK 中的一个文件, 位置是 $/android-ndk-r9d/platforms/android ...

  6. javascript语法之with语句

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. Ubuntu 14 安装MySQL指南

    ubuntu 14 安装MySQL指南安装MySQLsudo apt-get install mysql-server这个应该很简单了,而且我觉得大家在安装方面也没什么太大问题,所以也就不多说了,下面 ...

  8. Eclipse搭建Android环境失败的解决方案

    今天在Eclipse上搭建Android开发环境,不仅在安装ADT的过程中老是出错,而且Android SDK下载后,打开SDK Manager时也无法链接到网页下载tools,网上查了好多方法,试了 ...

  9. BezierDemo开源项目的学习

    多看多学涨姿势,no zuo nuo die做暖男 1.概述 国际惯例,首先感谢一下开源作者. 这个项目主要是实现实现qq红点拖拽的效果 地址在https://github.com/chenupt/B ...

  10. 使用Multiplayer Networking做一个简单的多人游戏例子-2/3(Unity3D开发之二十六)

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/51007512 ...