一、线程基础:

1.CPU核心数和线程数的关系

线程数:是同一时刻设备能并行执行的程序个数,线程数=cpu个数 * 核数,及程数=cpu个数(2) * 核数(2)=4;

使用了超线程技术后---> 1:2

2.cpu线程数和Java多线程

(1) 线程是CPU级别的,单个线程同时只能在单个cpu线程中执行

(2) java多线程并不是由于cpu线程数为多个才称为多线程,当Java线程数大于cpu线程数,操作系统使用时间片机制,采用线程调度算法,频繁的进行线程切换。

(3) 线程是操作系统最小的调度单位,进程是资源(比如:内存)分配的最小单位

(4)Java中的所有线程在JVM进程中,CPU调度的是进程中的线程

****时间片机制:又称RR调度,会导致上下文切换

3. 什么是进程和线程

进程:程序运行资源分配的最小单位,进程内部有多个线程,会共享这个进程的资源
线程:CPU调度的最小单位,必须依赖进程而存在。

4. 澄清并行和并发

并行:同一时刻,可以同时处理事情的能力

并发:与单位时间相关,在单位时间内可以处理事情的能力

5. 高并发编程的意义、好处和注意事项

好处:充分利用cpu的资源、加快用户响应的时间,程序模块化,异步化
问题:
线程共享资源,存在冲突;
容易导致死锁;
启用太多的线程,就有搞垮机器的可能

6.查看 JVM自启动线程

public static void main(String[] args) {
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false);
for (ThreadInfo threadInfo : threadInfos) {
System.out.println("[" + threadInfo.getThreadId() + "]" + " " + threadInfo.getThreadName());
}
}

Attach Listener(附加听众) :线程是负责接收到外部的命令,而对该命令进行执行的并且吧结果返回给发送者。通常我们会用一些命令去要求jvm给我们一些反馈信息,如:java -version、jmap、jstack等等。如果该线程在jvm启动的时候没有初始化,那么,则会在用户第一次执行jvm命令时,得到启动。
signal dispather(信号分配器): 前面我们提到第一个Attach Listener线程的职责是接收外部jvm命令,当命令接收成功后,会交给signal dispather线程去进行分发到各个不同的模块处理命令,并且返回处理结果。signal dispather线程也是在第一次接收外部jvm命令时,进行初始化工作。
Finalizer(终结器): 用来执行所有用户Finalizer 方法的线程

1)只有当开始一轮垃圾收集时,才会开始调用finalize()方法;因此并不是所有对象的finalize()方法都会被执行;

  2)该线程也是daemon线程,因此如果虚拟机中没有其他非daemon线程,不管该线程有没有执行完finalize()方法,JVM也会退出;

  3) JVM在垃圾收集时会将失去引用的对象包装成Finalizer对象(Reference的实现),并放入ReferenceQueue,由Finalizer线程来处理;最后将该Finalizer对象的引用置为null,由垃圾收集器来回收;

  4) JVM为什么要单独用一个线程来执行finalize()方法呢?如果JVM的垃圾收集线程自己来做,很有可能由于在finalize()方法中误操作导致GC线程停止或不可控,这对GC线程来说是一种灾难;

Reference Handler(引用处理程序) :JVM在创建main线程后就创建Reference Handler线程,其优先级最高,为10,它主要用于处理引用对象本身(软引用、弱引用、虚引用)的垃圾回收问题。

main:这4个线程,加上,main,所以总共会有5个线程被创建,可以通过上面的这几行代码来查看:

但是,当前活动的线程只有1个,就是main,System.out.println(Thread.activeCount()); 用这条命令返回值是1。这也经常被用作以下场合的判断

比如,在main线程中创建多个子线程后,如果子线程的耗时比main线程要长,main线程就会再子线程之前结束。假如main线程的结果需要用到子线程的返回值,那么我们通常就在main线程中加上这句代码:

  System.out.println(Thread.activeCount() >1),

来判断子线程是否全部运行结束,也就是当前活动线程只有main线程一个。这样做在windows下是没错的,但是!!!

在linux下就不是这样了,你会发现,即使所有的子线程全部结束,打印当前的活动线程是2!!!而不是1,除了main线程之外,linux下还会有一个Monitor Ctrl-Break 线程存在,这个线程是用来干嘛的呢?

Monitoring Thread Activity With Thread Dumps Thread dumps, or "thread stack traces," reveal information about an application's activity that can help you diagnose problems and better optimize application and JVM performance; for example, thread dumps can show the occurrence of "deadlock" conditions, which can seriously impact application performance. You can create a thread dump by invoking a control break (usually by pressing Ctrl-Break or Ctrl-\ or SIGQUIT on linux). This section provides information on working with thread dumps. It includes information on these subjects: 1.Lock Information in Thread Dumps 2.Detecting Deadlocks

这是oracle官网的原话。大家可以自行翻译。 结论:在windows下可以用 Thread.activeCount() >1来判断子线程是否全部结束,但是linux中应该是 Thread.activeCount() > 2

    • Java management包
      management包中提供了比较全面的监控和管理工具,包括JVM的监管API、监管API日志等等。
    • 管理接口
      PlatformManagementObject接口:所有的管理接口都要继承该接口,这个接口是从1.7才出现的,从其文档的注释中可以看到其存在的价值是为以后平台的扩展而设计的,而不是为了应用程序。
      BufferPoolMXBean接口:缓冲池管理接口包括direct和mapped类型的缓冲池。
      ClassLoadingMXBean接口:类加载管理接口,可以监控管理虚拟机类加载系统。
      CompilationMXBean接口:虚拟机的编译系统的管理与监控。
      GarbageCollectorMXBean接口:虚拟机垃圾收集的管理接口,通过该接口可以查看垃圾收集的时间和次数。
      MemoryManagerMXBean接口:该接口用于内存管理,其中,垃圾收集器属于该类型的内存管理器。
      MemoryMXBean接口:用于虚拟机的内存管理,执行GC、获取堆内存和非堆内存相关数据。
      MemoryPoolMXBean接口:用于内存池的管理,所谓的内存池表示的是虚拟机使用和内存管理者管理的内存资源。
      OperatingSystemMXBean接口:操作系统管理接口,可以查看系统的平均负载、系统参数、可用的进程数、系统版本和名称等等。
      PlatformLoggingMXBean接口:日志管理接口,可以设置日志级别、获取日志名称等等。
      RuntimeMXBean接口:虚拟机运行时管理接口,获取虚拟机的名称、虚拟机版本、获取java的classpath、获取系统参数等。
      ThreadMXBean接口:虚拟机线程管理。可以获取线程数、获取线程Id、线程信息、当前线程CPU时间、当前线程用户时间、查看死锁线程等等。
    • 信息类实体
      LockInfo:任何的java锁(简单的java锁和Concurrent包中所使用的锁,AbstractOwnableSynchronizer和Condition的实现类/子类)。
      MemoryUsage:内存使用快照,用于获取每个虚拟机或者堆或者虚拟机非堆内存池作为整体的使用信息。
      MemoryNotificationInfo:内存通知的信息。
      MonitorInfo:继承自LockInfo,同步代码块或者是同步方法上的锁。
      ThreadInfo:线程信息,包括线程名称,线程id,阻塞时间,阻塞次数,等待时间,等待次数,锁信息,锁名称,锁拥有者id等。
      ManagementPermission:权限管理类。
    • 工厂类
      ManagementFactory:MXBean通过该工厂类进行获取,使用了工厂模式管理,经过该类获取到相应的MXBean类之后再调用其中的方法得到需要管理和监控的信息。

7.查看 JVM自启动线程

在Java的多线程编程中,java.lang.Thread类型包含了一些列的方法start(), stop(), stop(Throwable) and suspend(), destroy() and resume()。通过这些方法,我们可以对线程进行方便的操作,但是这些方法中,只有start()方法得到了保留。

在JDK帮助文档以及Sun公司的一篇文章《Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 》中都讲解了舍弃这些方法的原因。

java--浅谈线程的更多相关文章

  1. 浅谈线程池(中):独立线程池的作用及IO线程池

    原文地址:http://blog.zhaojie.me/2009/07/thread-pool-2-dedicate-pool-and-io-pool.html 在上一篇文章中,我们简单讨论了线程池的 ...

  2. 浅谈线程池(上):线程池的作用及CLR线程池

    原文地址:http://blog.zhaojie.me/2009/07/thread-pool-1-the-goal-and-the-clr-thread-pool.html 线程池是一个重要的概念. ...

  3. java 浅谈web系统当中的cookie和session会话机制

    一 Cookie: 1. Cookie翻译为小甜饼,有一种特殊的味道.cookie主要用来在(浏览器)客户端做记号用的.Cookie不属于java,Cookie是一种通用的机制,属于HTTP协议的一部 ...

  4. 浅谈线程runnable和callable的使用及区别

    线程使用比较广泛,但实际上一般项目很少用上线程,线程常用于优化复杂的程序执行流程,把一些与业务关系关系不大但是必须要执行的流程使用线程的方式让子线程去执行,主流程只返回跟业务有关的信息 runnabl ...

  5. [Android&Java]浅谈设计模式-代码篇:观察者模式Observer

    观察者,就如同一个人,对非常多东西都感兴趣,就好像音乐.电子产品.Game.股票等,这些东西的变化都能引起爱好者们的注意并时刻关注他们.在代码中.我们也有这种一种方式来设计一些好玩的思想来.今天就写个 ...

  6. 浅谈Java线程安全

    浅谈Java线程安全 - - 2019-04-25    17:37:28 线程安全 Java中的线程安全 按照线程安全的安全程序由强至弱来排序,我们可以将Java语言中各种操作共享的数据分为以下五类 ...

  7. 浅谈利用同步机制解决Java中的线程安全问题

    我们知道大多数程序都不会是单线程程序,单线程程序的功能非常有限,我们假设一下所有的程序都是单线程程序,那么会带来怎样的结果呢?假如淘宝是单线程程序,一直都只能一个一个用户去访问,你要在网上买东西还得等 ...

  8. 浅谈JAVA集合框架

    浅谈JAVA集合框架 Java提供了数种持有对象的方式,包括语言内置的Array,还有就是utilities中提供的容器类(container classes),又称群集类(collection cl ...

  9. 浅谈java性能分析

    浅谈java性能分析,效能分析 在老师强烈的要求下做了效能分析,对上次写过的词频统计的程序进行分析以及改进. 对于效能分析:我个人很浅显的认为就是程序的运行效率,代码的执行效率等等. java做性能测 ...

  10. !! 浅谈Java学习方法和后期面试技巧

    浅谈Java学习方法和后期面试技巧 昨天查看3303回复33 部落用户大酋长 下面简单列举一下大家学习java的一个系统知识点的一些介绍 一.java基础部分:java基础的时候,有些知识点是非常重要 ...

随机推荐

  1. struts2标签使用详解

    Struts2常用标签总结一 介绍1.Struts2的作用 Struts2标签库提供了主题.模板支持,极大地简化了视图页面的编写,而且,struts2的主题.模板都提供了很好的扩展性.实现了更好的代码 ...

  2. Hadoop中的控制脚本

    1.提出问题 在上篇博文中,提到了为什么要配置ssh免密码登录,说是Hadoop控制脚本依赖SSH来执行针对整个集群的操作,那么Hadoop中控制脚本都是什么东西呢?具体是如何通过SSH来针对整个集群 ...

  3. Creating Custom UITableViewCells with NIB files

    Maksim Pecherskiy 13 November 2012 Well this sucks. Apparently these days you can only use the Inter ...

  4. 编写高质量代码改善C#程序的157个建议——建议64:为循环增加Tester-Doer模式而不是将try-catch置于循环内

    建议64:为循环增加Tester-Doer模式而不是将try-catch置于循环内 如果需要在循环中引发异常,你需要特别注意,应为抛出异常是一个相当影响性能的过程.应该尽量在循环当中对异常发生的一些条 ...

  5. hive(在大数据集合上的类SQL查询和表)学习

    1.jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&characterEncoding=UTF-8&use ...

  6. sampling method

    sampling method 背景 在贝叶斯框架下,利用后验分布对参数进行估计,也即 其中 (1)是参数的先验分布. (2)是似然分布,数据集的生成联合概率 (3)是参数的后验分布. 通常分布很复杂 ...

  7. leetcode 移动零

    给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序. 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 这道题比较好想出来 /** ...

  8. ML.NET 0.9 版本发布---.net下的机器学习引擎

    欢迎来到 2019年!在过去的9个月里, 我们一直在为ML.NET添加新的特征和改进相关功能.在提交1.0版本之前,我们将专注于包的整体稳定性并对API进行不断优化, 扩大测试的覆盖面并对开发文档进行 ...

  9. Major Performance Impacts

    - Default opaque flags (3s) - Filter size (3s) - ??? (4s) - Image refresh performance (1s)

  10. ORA-01722: 无效数字的解决方法

    Select Count(t.Wip_No) As Consignvendnewcreateno_Num From   Apps.View_Scm_Wip_Po t Where  1 = 1 And  ...