Java多线程——Thread的native底层实现

Java多线程

  • 当我们去阅读java的Thread类的时候,会发现这个类与大部分的java类库API有着明显的差别,它的所有关键方法都被声明为native
  • native本身指代的就是本地方法,而又由于java线程模型采用基于操作系统原生线程模型,这里默认Thread中native方式代指的是Native POSIX Thread Library
  • 线程的实现方式有三种:分别是内核线程实现(1:1实现),使用用户线程实现(1:N),使用用户线程加轻量级进程混合实现(N:M实现)。而Java从1.3开始线程模型普遍采用基于操作系统原生线程模型来实现,即1:1。
  • Hotpot自己是不会去干涉线程调度的,可以设置线程优先级给OS提供调度建议。
  • Linux把不同的PID与系统中每个进程或轻量级进程相关联。另一方面,一个多线程应用程序中的所有线程只有一个相同的PID。
  • 正因为多个线程有相同的PID,所以引入了线程组的概念,而一个线程组中的所有线程使用和该线程组的领先进程相同的PID,也就是该组中第一个轻量级进程的PID,它被存入进程描述符的tgid字段中。
  • 有真正意义上的线程,它的实现是由进程来模拟,所以属于用户级线程,位于libpthread共享库。具体到内存中的数据结构,则是进程描述符数据结构中的一个指针指向thread_info,这个就是线程描述符,存储区域大小为两个叶框(2*4K)。

Q&A

  • Q1:在一个程序中,代码的不同位置创建的fork(),所以这个程序就是多线程的?
  • A:不对,同一个程序创建的fork()创建的程序的多进程的程序,每个fork()之间属于父子进程的关系(父子进程的通信方式可以只允许父子进程通信的方式管道,而FIFO则是允许非父子间进行通信)。
  • Q2:一个操作系统最多创建多少个进程,一个进程最多创建多少个线程?
  • A:一个操作系统最多创建的进程上线与proc表(linux下/proc)的大小有关,而proc表的大小取决于总线宽度(因为总线宽度决定了指针的个数),比如4G个。
  • Q3:如何查看内核线程?
  • A:ps afx

参考博文:

多线程编程小结:https://blog.csdn.net/skyroben/article/details/72793409
《深入理解Java虚拟机:JVM高级特性与最佳实践》
《深入理解linux内核》

原文地址:https://www.cnblogs.com/SsoZhNO-1/p/12543656.html

时间: 2024-08-28 23:38:31

Java多线程——Thread的native底层实现的相关文章

探Java多线程Thread类和Runnable接口之间的联系

首先复习一下Java多线程实现机制,Java实现多线程方法有如下这么几种: 1.继承了(extends)Thread类 2.实现了(implements)Runnable接口 也就是说  有如下两种情况 情况1: 继承Thread类.重写其方法run() .    然后new之.调用Start()方法 1 public class TestThread 2 { 3 private int i; 4 public static void main(String[] args) 5 { 6 // T

Java 多线程——Thread类和Runable接口

在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限, 下面看例子: [java] view plaincopy package org.thread.demo; class MyThread extends Thread{ private String name; public

java 多线程--- Thread Runnable Executors

java 实现多线程的整理: Thread实现多线程的两种方式: (1)继承 Thread类,同时重载 run 方法: class PrimeThread extends Thread { long minPrime; primeThread(long minPrime) { this.minPrime = minPrime; } public void run() { // compute primes larger than minPrime } } PrimeThread p = new

[java多线程] - Thread&Runnable运用

负载是一个很大的话题,也是一个非常重要的话题.不管是在大的互联网软件中,还是在一般的小型软件,都对负载有一定的要求,负载过高会导致服务器压力过大:负载过低又比较浪费服务器资源,而且当高请求的时候还可能出现低效率的问题.多线程就是一种提高服务效率的方式.面对海量的用户请求,单线程肯定扛不住,那么多线程的需求也就应运而生,所以说掌握多线程的开发技术对于技术人员来说肯定是非常重要的.参考文档http://docs.oracle.com/javase/7/docs/api/. 一.Runnable使用

JAVA——多线程Thread

进程: 是一个正在执行中的程序.每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元. 线程: 就是进程中的一个独立的控制单元.线程在控制着进程的执行. 一个进程中至少有一个线程. Java VM启动的时候会有一个进程java.exe 该进程中至少一个线程负责java程序的执行.而且这个线程运行的代码存在于main方法中.该线程称为主线程. 扩展: 其实更细节说明JVM,JVM启动不止一个线程,还有负责 垃圾回收的线程. 1.如何在自定义的代码中,自定义一个线程呢? 通过对A

JAVA多线程Thread VS Runnable详解

要求 必备知识 本文要求基本了解JAVA编程知识. 开发环境 windows 7/EditPlus 演示地址 源文件 进程与线程 进程是程序在处理机中的一次运行.一个进程既包括其所要执行的指令,也包括了执行指令所需的系统资源,不同进程所占用的系统资源相对独立.所以进程是重量级的任务,它们之间的通信和转换都需要操作系统付出较大的开销. 线程是进程中的一个实体,是被系统独立调度和分派的基本单位.线程自己基本上不拥有系统资源,但它可以与同属一个进程的其他线程共享进程所拥有的全部资源.所以线程是轻量级的

Java 多线程(Thread) 同步(synchronized) 以及 wait, notify 相关 [实例介绍]

场景描述 有一家很大的商场,在某市有几个商品配送中心,并有几家分店,这家商场经营很多的商品,平时运营情况是这样的: 根据各分店的商品销售情况,给分店配送相应需求量的商品:并上架到分店指让的位置,供客户选购. 客户选择自己需要的商品,然后到收银台交钱打包; 然后到一天的某个时候分店管理员(经理等),开始统计当前的销售情况,并计划向商品配送中心订购各商品的配送量: 场景模拟 1. 商场类; public class StoreMart { //商场这一天剩余的商品量 private static M

java多线程(thread/runnable)

1 class Thread1 extends Thread Thread1 mTh1=new Thread1("A"); Thread1 mTh2=new Thread1("B"); mTh1.start(); mTh2.start(); 2 class Thread2 implements Runnable new Thread(new Thread2("C")).start(); new Thread(new Thread2("D

Java多线程Thread使用匿名内部类创建的两种方式

匿名内部类实现线程的两种方式: 第一种方式: 1.继承Thread类 2.重写run方法 3.将要执行的代码写在run方法中 第二种方式: 1.将Runnable的子类对象传递给Thread的构造方法 2.重写run方法 3.将执行的代码写在run方法中,最后我们开启线程 package com.yyx.thread; /** * 匿名内部类创建线程 yyx 2018年2月4日 */ public class AnonymousThread { public static void main(S