1.什么是线程

将线程理解为轻量级进程,它与进程的最大的区别是:

多个线程共享一个进程资源;

对于OS的许多资源的分配和管理(如内存)通常都是进程级别的,线程只是os调度的最小单位;

相对于进程来说更轻量,上下文信息更少,创建、销毁更简单,若线程被挂起,不会导致整个进程被挂起。

2.在java中如何使用线程

  • 实现Runnable接口,然后通过new Thread(new RunnableImpl()).start();创建线程。
public interface Runnable {
public abstract void run();
}
  • 继承Thread类(Thread类自身实现了Runnable接口), new MyThread().start()创建线程。
start()方法是怎么启动线程的?  -  摘自《java特种兵》

实现方式1
基于Kernel Thread(KLT)的映射来实现:KLT是内核线程,内核线程由OS直接完成调度切换,它相对应用程序的线程来讲只是一个借口,
外部程序会使用一种轻量级进程(Light Weight Process, LWP)来与KLT进行一对一的借口调用。
也就是说,进程内部会尝试利用OS的内核线程去参与实际的调度,而自己使用API调用作为中间桥梁与自己的程序交互。

3.JAVA中线程的状态

  • NEW (执行 start()之前,需注意:调用了start()并不代表状态立即改变,中间还有一些步骤,要看那些中间步骤是否已经完成了)
  • RUNNABLE (可以理解为活着并尝试征用CPU)
  • BLOCKED(阻塞状态,或者说线程已被挂起, 是在多个线程有同步操作的场景, 比如正在等待另一个线程的synchronized 块的执行释放, 或者可重入的 synchronized块里别人调用wait() 方法, 也就说线程在等待进入临界区)
  • WAITING (一个线程拥有锁对象后,执行wait()方法)
  • TIMED_WAITING (sleep()之后进入此状态)
  • TERMINATED (run()方法执行结束后就处于此状态,在操作系统内部可能已经注销了相应的线程,活着将它复用给其他需要使用线程的请求)

4.线程优先级

cpu的资源是有限的,在某些情况下,我们可以设置线程的优先级,让OS根据不同的优先级进行调度

线程调度的优先级,每个OS都有不同的实现,java虚拟机为了兼容各种OS设定了1-10个优先级,理论上数字越大,优先级越高。

而某些OS可能只有3-5个线程,那么jvm会根据实际情况将 1-10这10个数字与OS的线程优先级做一个映射关系。

那么思考一下,很有可能 优先级3 和  优先级5 在OS中是同一个优先级。

java中通过setPriority(int)方法来设置一个线程的优先级。 在实际工作中,通常将优先级设置为普通(5,默认),最大(10),最小(1)。

5.守护线程

java中有两类线程 User Thread 和 Daemon Thread

守护线程--也称“服务线程”,在没有用户线程可服务时会自动离开。(GC 即为一个守护线程)

java中通过setDaemon(true)  将一个线程设置为守护线程,但是需注意两点

1.thread.setDaemon(true)必须在thread.start()之前设置,否则将会抛出IllegalThreadStateException异常

2.在Daemon线程中产生的新线程也是Daemon的

Thread中setDaemon实现

    public final void setDaemon(boolean on) {
checkAccess();
if (isAlive()) {
throw new IllegalThreadStateException();
}
daemon = on;
}

多线程系列 - 基础篇01 - 线程基本概念 & 线程优先级 & 守护线程 60%的更多相关文章

  1. Java多线程系列--“基础篇”01之 基本概念

    多线程是Java中不可避免的一个重要主体.从本章开始,我们将展开对多线程的学习.接下来的内容,是对“JDK中新增JUC包”之前的Java多线程内容的讲解,涉及到的内容包括,Object类中的wait( ...

  2. Java多线程系列 基础篇01 线程的状态

    1.进程和线程 进程: 计算机中程序关于某数据集合的一次运行活动,是计算机系统进行资源分配和调度的基本单位,是操作系统结构的基础. 线程: 线程是进程的实例,是CPU进行资源分配和调度的最小单位,线程 ...

  3. Java多线程系列--“基础篇”05之 线程等待与唤醒

    概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. wait()和notify()3. wait(long t ...

  4. Java多线程系列--“基础篇”06之 线程让步

    概要 本章,会对Thread中的线程让步方法yield()进行介绍.涉及到的内容包括:1. yield()介绍2. yield()示例3. yield() 与 wait()的比较 转载请注明出处:ht ...

  5. Java多线程系列--“基础篇”07之 线程休眠

    概要 本章,会对Thread中sleep()方法进行介绍.涉及到的内容包括:1. sleep()介绍2. sleep()示例3. sleep() 与 wait()的比较 转载请注明出处:http:// ...

  6. Java多线程系列--“基础篇”09之 interrupt()和线程终止方式

    概要 本章,会对线程的interrupt()中断和终止方式进行介绍.涉及到的内容包括:1. interrupt()说明2. 终止线程的方式2.1 终止处于“阻塞状态”的线程2.2 终止处于“运行状态” ...

  7. Java多线程系列--“基础篇”10之 线程优先级和守护线程

    概要 本章,会对守护线程和线程优先级进行介绍.涉及到的内容包括:1. 线程优先级的介绍2. 线程优先级的示例3. 守护线程的示例 转载请注明出处:http://www.cnblogs.com/skyw ...

  8. Java多线程系列--“基础篇”11之 生产消费者问题

    概要 本章,会对“生产/消费者问题”进行讨论.涉及到的内容包括:1. 生产/消费者模型2. 生产/消费者实现 转载请注明出处:http://www.cnblogs.com/skywang12345/p ...

  9. Java多线程系列--“基础篇”04之 synchronized关键字

    概要 本章,会对synchronized关键字进行介绍.涉及到的内容包括:1. synchronized原理2. synchronized基本规则3. synchronized方法 和 synchro ...

随机推荐

  1. Spring cloud Zuul网关异常处理

    Spring cloud Zuul网关异常处理 一 异常测试: 1> 创建一个pre类型的过滤器,并在该过滤器的run方法实现中抛出一个异常.比如下面的实现,在run方法中调用的doSometh ...

  2. 远景WEBGIS平台实现客户端SHP文件加载

    远景WEBGIS平台的研发目前取得新进展,实现客户端shp文件的加载,可以不经过PC上的数据转换工具转换. 远景WEBGIS平台(RemoteGIS)是基于HTML5自主研发的新一代WEBGIS基础平 ...

  3. 地图的平移、缩放的实现(android版)

    一.平移地图 移动地图的原理是利用手指在屏幕上拖动的距离,转换为在地图上距离,把地图坐标加上偏移的距离实现地图移动. 由于地图是绘制到Bitmap上的,所以地图移动和缩放的过程只要改变Bitmap的矩 ...

  4. (Stanford CS224d) Deep Learning and NLP课程笔记(一):Deep NLP

    Stanford大学在2015年开设了一门Deep Learning for Natural Language Processing的课程,广受好评.并在2016年春季再次开课.我将开始这门课程的学习 ...

  5. 3 使用selenium模拟登录csdn

    之前通过F12开发者模式调试,获取网站后台服务器验证用户名和密码的URL之后,再构造post数据的方式会存在一个问题,就是对目标网站的验证机制不明确,构造post数据除了用户名和密码之外,还可能有更复 ...

  6. 自学git心得-4

    本节介绍分支的一些具体应用实例. 1.Bug分支 设想我们正在分支dev上工作,突然接到一个修复bug的命令,我们需要创建分支issue-101来修复它,在此之前我们肯定需要先保存我们当前未完成的工作 ...

  7. postman trigger xdebug session in phpstorm

    phpstorm是一款非常棒的php开发调试工具,一般情况下我们使用firefox/chrome的bookmark,开启phpstorm debug侦听,随后点击start debugger, 我们就 ...

  8. Azure 中部署Gitlab的方法

    一.Azure 中创建Gitlab虚拟机(1).登陆Azure:打开Azure 官网,点击右侧上方的登陆Azure门户,输入Azure帐号与密码,点击 登陆 . (2).创建Gitlab虚拟机:登陆A ...

  9. Python问题1:IndentationError:expected an indented block

    Python语言是一款对缩进非常敏感的语言,给很多初学者带来了困惑,即便是很有经验的python程序员,也可能陷入陷阱当中.最常见的情况是tab和空格的混用会导致错误,或者缩进不对,而这是用肉眼无法分 ...

  10. queue_monitor

    red_4 droptail_4