热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

《java多线程编程核心技术》

window查看进程1、打开CMD2、进入JDK安装目录,进入bin目录3、jps查看正在运行的线程号4、jstack-l查看进程具体内容1、进程和线程的区别一个程序至少

window查看进程
1、打开CMD
2、进入JDK安装目录,进入bin目录
3、jps查看正在运行的线程号
4、jstack -l 查看进程具体内容

1、进程和线程的区别
一个程序至少有一个进程,一个进程至少有一个线程。
进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
进程是系统进行资源分配和调度的一个独立单位。
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间。

2、创建一个线程类可以继承Thread或者实现Runnable接口
一般情况下是继承Thread,当线程类已经继承了其他类时只能实现Runnable接口。

3、实例变量线程共享
new ThreadA().start() 不共享ThreadA中的变量
new Thread(threadA).start() ,共享变量放在线程threadA中, 如投票系统
4、Thread.currentThread().getName() 返回当前线程名称
5 isAlieve() 判断当前的线程是否处于活动状态。
6 getId() 获取线程的唯一ID
7 停止线程
stop(),不安全(释放锁),已被弃用,很暴力,需要手动做一些清理性工作
Thread.interrupt(),一般都用这个,但该方法只是标志一个中断的记号,并不会马上停止线程,并判断this.interrupted()。
this.interrupted() 测试当前线程是否已经中断,执行后具有将状态标志置清除为false
this.isInterrupt() 测试线程Thread对象是否已经中断, 不具有将状态标志置清除为false

try{
if(this.interrupted()){
throw new InterruptException();
}
......
}catch{} 这样就进入catch语句,运行下面的语句了

Thread.interrupt()也能将睡眠中的代码或遇到sleep()、wait()后直接进入catch语句,并清除停止状态为false。

8 suspend/resume 暂停/重新启用线程,已被弃用,
不释放锁,造成资源浪费
不同步
9 yield() 放弃当前的CPU资源,将其让给其他线程
10 线程的优先级,优先级较高的线程会优获得更多的CPU资源,从而优先处理(并不一定,只是概率大些)。
线程优先级范围为1到10
优先级具有继承性,子线程的优先级和父线程一致
优先级有规则性,优先级高的大部分会先执行
优先级随机性,并不是优先级高的线程一定先执行
11 线程有2种,一种是用户线程,一种是守护线程。
当进程中不存在非守护线程时,守护线程会自动销毁,只要当JVM实例中存在任何一个非守护线程没有结束,守护线程就在工作,(举例:GC,垃圾回收器)
thead.setDaemon(true);
12 出现异常,锁会被自动释放
synchronized(this) 在同一个对象中都是同步的,是锁定当前对象。
synchronized同步方法和synchronized(this)调用呈阻塞状态
同一时间只有一个线程可以执行synchronized同步方法中的代码
同一时间只有一个线程可以执行synchronized(this)代码块中的代码
13 synchronized(非this对象x),x一定要是同一对象才会同步,特别注意String类型,不是equal就可以,必须是同一个地址的同一个对象
14 volatile 使变量在多个线程间可见,强制从公共堆栈中取得变量的值,而不是从线程私有数据栈中取得变量值。
volatile 不具备原子性, synchronized具备原子性,synchronized包含volatile功能,但效率较低。
synchronized包含互斥性和可见性。
线程安全包含原子性和可见性两个方面,Java同步机制都是围绕这两个方面来确保线程安全的。

volatile 的使用条件 —— 即变量真正独立于其他变量和自己以前的值
将 volatile 变量作为状态标志使用
将 volatile 变量用于一次性安全发布
将 volatile 变量用于多个独立观察结果的发布
遵守 volatile bean 模式的 Person 对象

1 wait()/notify()/notifyAll()
必须在synchronized同步的Object临界区中使用,否则会抛出 IllegelMonitorStateException.
每个Object都实现了wait()和notify()方法
wait()方法可以使调用该方法的线程释放共享资源的锁,然后从运行状态退出,进入等待队列,直到被再次唤醒。
notify()方法可以随机唤醒等待队列中等待同一共享资源的一个线程,并使该线程退出等待队列,进入可运行状态。
notifyAll()方法可以使所有正在等待队列中等待同一共享资源的 全部 线程从等待状态退出,进入可运行状态。此时,优先级高的那个线程最先执行

synchronized(a){
a.wait();
}

2 IO阻塞、访问其他服务器、数据库、线程CPU处于空闲状态,可能会转而把CPU时间片分配给其他线程,进入 暂停状态。 阻塞(Blocked)状态结束后,进入runnable状态,等待系统重新分配资源。
3 线程出现阻塞的情况
调用sleep(),主动放弃占有的处理器资源。
调用了阻塞式IO方法,未返回。
试图获得一个同步监控器(锁资源),但监控器被其他线程占有。
线程等待某个通知
调用suspend方法将线程挂起,此方法容易导致死锁。
4 线程进入Runnable的情况
调用sleep(),已超过休眠时间。
调用了阻塞式IO方法,IO执行完毕。
成功获得一个同步监控器(锁资源)。
线程等待某个通知,其他线程发出了通知。
处于挂起状态的线程调用了resume()回复方法。
5 每个锁对象都有2个队列,一个就绪队列,一个阻塞队列。就绪队列存储将要获得锁的线程,阻塞队列存储被阻塞的线程线程被唤醒进入就绪队列等待CPU的调度,线程被wait后进入阻塞队列等待被唤醒
6 wait方法被执行后自动释放锁,notify()被执行后不自动释放锁。
7 wait(long) 等待某一时间内是否有线程对锁进行唤醒,如果超过这个时间则自动唤醒。
8 threadA.join() 等待threadA线程运行完销毁后再运行当前线程,具有使线程排队运行的作用,join在内部使用了wait()方法进行等待。
9 join(long)内部使用了wait(long),会释放锁,sleep(long)不会释放锁。

1 ReentrantLock , Lock对象里面可以创建多个Condition(即对象监听器)实例,线程对象可以注册到指定的Condition中,从而可以有选择性的进行线程通知。
相比wait() notify() notifyAll()在JVM中随机选择,Lock Condition可以选择性通知。
2 Lock lock = new ReentrantLock();
Condition cOndition= lock.newCondition();
使用condition.wait(), condition.signal(), condition.signalAll()方法之前必须先调用 lock.lock()
3 Lock分为公平锁和非公平锁
公平锁:Lock lock = new ReentrantLock(true),线程获取锁的顺序按照加锁的顺序来分配的,即FIFO
非公平锁:Lock lock = new ReentrantLock(false),线程获取锁的顺序是随机抢占的
4 int getHoldCount() 查询当前线程保持此锁定的个数,也就是调用lock()方法的次数
int getQueueLenght() 返回正等待获取此锁的线程数
int getWaitQueueLenght(Condition condition) 返回condition等待此锁的线程数
boolean isFair() 判断是不是公平锁
boolean isLocked() 判断是否被任意线程锁住
void lockInterrupbtibly() 如果当前线程未被中断,则获取锁定,如果已被中断则抛出异常
boolean tryLock() 紧在其他线程未保持锁定状态时才可以获得锁
boolean tryLock(long timeout, TimeUnit unit) 在等待的时间内,其他线程未保持锁定状态,且当前线程未被中断,则获得该锁定。
5 ReentrantReadWriteLock 读写锁
对于写操作较少,读较多的线程效率会大大提高。
表示有2把锁,读锁、写锁,多个读锁之间不互斥,读锁与写锁互斥,写锁与写锁互斥。


推荐阅读
  • 在《Linux高性能服务器编程》一书中,第3.2节深入探讨了TCP报头的结构与功能。TCP报头是每个TCP数据段中不可或缺的部分,它不仅包含了源端口和目的端口的信息,还负责管理TCP连接的状态和控制。本节内容详尽地解析了TCP报头的各项字段及其作用,为读者提供了深入理解TCP协议的基础。 ... [详细]
  • Python多线程编程技巧与实战应用详解 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • 深入解析 Synchronized 锁的升级机制及其在并发编程中的应用
    深入解析 Synchronized 锁的升级机制及其在并发编程中的应用 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • 利用 Python Socket 实现 ICMP 协议下的网络通信
    在计算机网络课程的2.1实验中,学生需要通过Python Socket编程实现一种基于ICMP协议的网络通信功能。与操作系统自带的Ping命令类似,该实验要求学生开发一个简化的、非标准的ICMP通信程序,以加深对ICMP协议及其在网络通信中的应用的理解。通过这一实验,学生将掌握如何使用Python Socket库来构建和解析ICMP数据包,并实现基本的网络探测功能。 ... [详细]
  • 在iOS开发中,基于HTTPS协议的安全网络请求实现至关重要。HTTPS(全称:HyperText Transfer Protocol over Secure Socket Layer)是一种旨在提供安全通信的HTTP扩展,通过SSL/TLS加密技术确保数据传输的安全性和隐私性。本文将详细介绍如何在iOS应用中实现安全的HTTPS网络请求,包括证书验证、SSL握手过程以及常见安全问题的解决方法。 ... [详细]
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
  • 在使用 SQL Server 时,连接故障是用户最常见的问题之一。通常,连接 SQL Server 的方法有两种:一种是通过 SQL Server 自带的客户端工具,例如 SQL Server Management Studio;另一种是通过第三方应用程序或开发工具进行连接。本文将详细分析导致连接故障的常见原因,并提供相应的解决策略,帮助用户有效排除连接问题。 ... [详细]
  • 手指触控|Android电容屏幕驱动调试指南
    手指触控|Android电容屏幕驱动调试指南 ... [详细]
  • 本文探讨了 Kafka 集群的高效部署与优化策略。首先介绍了 Kafka 的下载与安装步骤,包括从官方网站获取最新版本的压缩包并进行解压。随后详细讨论了集群配置的最佳实践,涵盖节点选择、网络优化和性能调优等方面,旨在提升系统的稳定性和处理能力。此外,还提供了常见的故障排查方法和监控方案,帮助运维人员更好地管理和维护 Kafka 集群。 ... [详细]
  • 数字图书馆近期展出了一批精选的Linux经典著作,这些书籍虽然部分较为陈旧,但依然具有重要的参考价值。如需转载相关内容,请务必注明来源:小文论坛(http://www.xiaowenbbs.com)。 ... [详细]
  • 本文深入探讨了Ajax的工作机制及其在现代Web开发中的应用。Ajax作为一种异步通信技术,改变了传统的客户端与服务器直接交互的模式。通过引入Ajax,客户端与服务器之间的通信变得更加高效和灵活。文章详细分析了Ajax的核心原理,包括XMLHttpRequest对象的使用、数据传输格式(如JSON和XML)以及事件处理机制。此外,还介绍了Ajax在提升用户体验、实现动态页面更新等方面的具体应用,并讨论了其在当前Web开发中的重要性和未来发展趋势。 ... [详细]
author-avatar
ik人生如梦场
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有