1、概述

我在写“系统间通信技术专栏”的时候,收到很多读者的反馈。其中有一部分读者希望我抽空写一写自己关于对Java线程的使用经验和总结。巧的是,这个月我所在的技术团队也有很多同事跟我讨论关于JAVA中线程的操作。正好本月我工作也不是很忙,除了继续推进我的重点专栏“系统间通信技术”外,可以更多的空余时间跟各位读者分享自己对JAVA线程技术的理解和使用经验。

本人不才,应读者要求新开专栏,与各位读者分享自己对JAVA线程技术的理解和使用经验。这个专栏将分成两个部分:线程基础知识和锁知识。专栏的难度应该是我所开专栏中难度最低的一个,着重于线程基础知识的讲解,更适合JAVA初学者阅读,目的是希望能够帮助大家提高codeing水平和程序质量。如果您是经验老道的高手也欢迎和本人讨论相关问题,对本人文章的论点进行勘误,您的支持是我写作的关键动力。当然本人的更多精力还是放在继续完成“系统间通信技术”这个专栏。(本系列的博客文章将不会置顶)

2、操作系统和线程原理

线程是一个操作系统级别的概念。JAVA语言(包括其他编程语言)本身不创建线程;而是调用操作系统层提供的接口创建、控制、销毁线程实例。

首先要说明的是,根据操作系统的不同(Windows/Unix/Linux/其他),他们所支持的线程底层实现和操作效果也是不尽相同的。不过一个操作系统支持的线程至少会有四种状态:就绪、执行、阻塞和终结。线程在四种状态下进行切换,都是要消耗不少的CPU计算能力的。

并且根据操作系统使用线程的进程的不一样,线程还分为用户线程和操作系统线程。操作系统线程(内核线程),是指操作系统内核为了完成硬件接口层操作,由操作系统内核创建的线程:例如I/O操作的内核线程,这些线程应用程序是不能干预的;用户线程,是指用户安装/管理的应用程序,为执行某一种操作,而由这个应用程序创建的线程。后文我们讨论的JAVA线程,都是用户级线程。

线程在创建时,操作系统不会为这个线程分配独立的资源(除了必要的数据支撑)。一个应用程序(进程)下的所有线程,都是共享这个应用程序(进程)中的资源,例如这个应用程序的CPU资源、I/O资源、内存资源。

现在基本上主流操作系统都支持多线程实现。即一个应用程序中(一个进程中),可以创建多个线程。一个应用程序下,各个线程间都可以进行通讯、可以进行状态互操作。且一个进程中,至少有一个线程存在。

3、JAVA中最简单的线程示例

JAVA中提供了丰富的操作系统接口实现,帮助我们进行线程操作。这些实现分布在java的java.lang基础包、java.io基础包和java.util.concurrent工具包当中;这个专栏所涉及到的代码示例也会从易到难向大家进行演示。我们先来看看JAVA中最基本的线程操作实现(高手请绕行)。

3-1、Thread父类

java.lang.Thread类是JAVA中用于实现线程操作的最基本的类之一。您可以创建一个集成Thread类的子类来定义您自己的线程实现:

1 packagetest.thread.base;2

3 importorg.apache.commons.logging.Log;4 importorg.apache.commons.logging.LogFactory;5 importorg.apache.log4j.BasicConfigurator;6

7 public class MyDefindThread extendsThread {8

9 static{10 BasicConfigurator.configure();11 }12

13 /**

14 * 日志。一定要使用Log4j才行。否则你就用System.out吧15 */

16 private static final Log LOGGER= LogFactory.getLog(MyDefindThread.class);17

18 /*(non-Javadoc)19 * @see java.lang.Thread#run()20 */

21 @Override22 public voidrun() {23 Long threadId = this.getId();24 MyDefindThread.LOGGER.info("线程(" + threadId + ")做了一些事情,然后结束了。");25 }26

27 public static void main(String[] args) throwsException {28 newMyDefindThread().start();29 }30 }

3-2、Runable接口

除了可以继承java.lang.Thread类来定义自己的线程外,您还可以实现java.lang.Runnable接口来定义一个线程(一般情况,我们优先使用这种方式):

1 packagetest.thread.base;2

3 importorg.apache.commons.logging.Log;4 importorg.apache.commons.logging.LogFactory;5 importorg.apache.log4j.BasicConfigurator;6

7 public class MyDefindRunnable implementsRunnable {8

9 static{10 BasicConfigurator.configure();11 }12

13 /**

14 * 日志。一定要使用Log4j才行。否则你就用System.out吧15 */

16 private static final Log LOGGER= LogFactory.getLog(MyDefindThread.class);17

18 /*(non-Javadoc)19 * @see java.lang.Runnable#run()20 */

21 @Override22 public voidrun() {23 //获取当前线程的ID

24 long threadId =Thread.currentThread().getId();25 MyDefindRunnable.LOGGER.info("线程(" + threadId + ")做了一些事情,然后结束了。");26 }27

28 public static void main(String[] args) throwsException {29 new Thread(newMyDefindRunnable()).start();30 }31 }

以上的两段代码都没有太多可讲解的。您可以在调试环境下观察到JAVA应用程序是如何运行线程的:

4、下文介绍

下一篇文章中,我们将继续介绍Java所支持的线程间基本互操作,包括:阻塞、唤醒、终止等操作;然后介绍Java原生线程池的工作原理和基本操作。

java 线程 操作系统线程_线程基础:线程(1)——操作系统和线程原理相关推荐

  1. python 线程超时设置_爬虫基础知识(一)多线程与threading模块

    点击上方"蓝字"关注我们,第一时间推送优质文章! 前言 "本期带来的文章是python中多线程与threading模块的主要内容.主要分为「并发与并行」,「进程与线程」, ...

  2. java子线程的创建_Java多线程基础(一):线程的创建

    多线程基础 并行与并发 并发是指一个处理器同时处理多个任务. 并行是指多个处理器或者是多核的处理器同时处理多个不同的任务. 打个比方:在并发的状态下,餐厅里只有一个厨师,尽管他做事利索,餐厅的客人等待 ...

  3. java 线程的构造函数_[c++11]多线程编程(二)——理解线程类的构造函数

    构造函数的参数 std::thread类的构造函数是使用可变参数模板实现的,也就是说,可以传递任意个参数,第一个参数是线程的入口函数,而后面的若干个参数是该函数的参数. 第一参数的类型并不是c语言中的 ...

  4. threadpooltaskexecutor线程池使用_(四)为什么要使用线程池

    阿里开发手册有一段描述: [强制]线程资源必须通过线程池提供,不允许在应用中自行显式创建线程. 说明:使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源不足的问题.如果不使 ...

  5. burp爆破线程设置多少_多线程到底需要设置多少个线程?

    我们在使用线程池的时候,会有两个疑问点: 线程池的线程数量设置过多会导致线程竞争激烈 如果线程数量设置过少的话,还会导致系统无法充分利用计算机资源 那么如何设置才不会影响系统性能呢?其实线程池的设置是 ...

  6. jmeter进程和线程的区别_一文搞懂进程和线程的区别

    计算机系统是由硬件和软件组成的,它们共同协作以运行应用程序.先来看下面这张一个典型的计算机系统的硬件组成图 从上图中看出一个系统由 CPU.ALU(算术逻辑单元).PC(程序计数器).总线(贯穿整个系 ...

  7. 为什么重新new两个线程线程号相同_面试官每次问我关于线程间通信方法,我都回答的很糟糕...

    线程的生命周期 废话不多写.首先我们先回顾回顾,理解下线程的生命周期,以及不同的阶段的区别: 新建状态(NEW) 当程序使用new关键字创建了一个线程之后,该线程就处于新建状态,此时仅由JVM为其分配 ...

  8. tomcat线程释放时间_详解tomcat的连接数与线程池

    前言 在使用tomcat时,经常会遇到连接数.线程数之类的配置问题,要真正理解这些概念,必须先了解Tomcat的连接器(Connector). 在前面的文章 详解Tomcat配置文件server.xm ...

  9. volatile能保持线程安全吗_从volatile说到i++的线程安全问题

    一般说来,volaTIle用在如下的几个地方: 1.中断服务程序中修改的供其它程序检测的变量需要加volaTIle: 2.多任务环境下各任务间共享的标志应该加volaTIle: 3.存储器映射的硬件寄 ...

  10. hashmap为什么线程不安全_面试官:你说 HashMap 线程不安全,它为啥不安全呢?...

    扫描下方海报 试读 本文来源: http://cnblogs.com/developer_chan/p/10450908.html 我们都知道HashMap是线程不安全的,在多线程环境中不建议使用,但 ...

最新文章

  1. HashSet中的add()方法( 一 )(详尽版)
  2. 如何在 Linux 中启用 Shell 脚本的调试模式
  3. mysql mysqld.sock_MySQL笔记-最简单的方法来解决找不到mysqld.sock文件的问题
  4. mysql文件脱机_SQL数据库的脱机与联机操作
  5. 联发科有没有高端处理器_2021年华为将成为联发科最大客户?麒麟或将“灭亡?”...
  6. kali系统apt设置代理
  7. Android N 去电流程,【私人备忘录】Android P 去电代码流程
  8. hive hql文档_大数据学习不能停,看看如何安装hive快800倍!共572.91M视频文档
  9. 上海地图全图可放大_好书·推荐丨第一次将近代上海行号与地图合并在路图中,你知道是哪本书吗?...
  10. Windows Terminal Preview v0.4 发布,微软出品的全新终端
  11. 在Magento首页显示新产品怎么设置
  12. 浏览器并发连接数(转载)
  13. 如何删除win10的windows.old
  14. Java简单代码-用*号拼三角形
  15. 最好的UI/UE设计资源网站推荐-免费的头像库
  16. 【layoutit!】基于 bootstrap 实现可视化布局工具
  17. [译] APT分析报告:07.拉撒路(Lazarus)使用的两款恶意软件分析
  18. matlab拟合图形边界,matlab - MATLAB 3D曲线拟合,带有附加边界 - SO中文参考 - www.soinside.com...
  19. package installer has been stopped怎么解决
  20. 狐妖小红娘的主题曲用计算机弹奏,1红娘曲谱_跪求狐妖小红娘新主题曲钢琴曲谱...

热门文章

  1. 平台型OA=高性价比OA?
  2. 男士剧烈运动后应注意
  3. Nginx变身爆火神器,手把手教你在永洪BI中应用
  4. 素质教育,是救命稻草,还是压垮教培机构的最后一根稻草
  5. 文件可视化编辑_高维数据可视化必备图形平行坐标图
  6. java 微信多媒体文件_java微信开发之上传下载多媒体文件
  7. python3.7安装教程mac_mac中怎么安装python3
  8. CTF-Xortool,windows上的安装与使用
  9. python变量和变量赋值的几种形式
  10. python中的set函数、列表的操作