2.1线程属性

属性 属性类型及用途  只读属性  注意事项
编号(id) long型,标识不同线程  是  不适合用作唯一标识
名称(name) String型,区分不同线程  否  设置名称有助于代码调试和问题定位
线程类别(daemon) boolean型,true为守护线程,false为用户线程  否  在start方法之前设置,关键任务线程应设置成用户线程
优先级(priority) int型,1-10的优先级,默认值5  否  建议使用默认值

*用户线程会阻止java虚拟机的正常停止,当所有用户线程都运行结束,java虚拟机才能停止;守护线程不会影响java虚拟机的正常停止,例如用于监视其他线程的运行情况。如果是强制终止java虚拟机进程,则所有线程都会停止。

2.2线程方法

方法 功能  备注
static Thread currentThread()  返回当前线程,即当前代码的执行线程  同一段代码可能被不同线程执行,所有当前线程可能是不同的
void run()  用于实现线程的任务处理逻辑  是由java虚拟机直接调用的,应用程序不应调用该方法
void start()  启动相应线程  一个Thread实例的start方法只能被调用一次。多次调用会抛出异常
void join()  等待相应线程运行结束  若A线程中调用B线程的join方法,表示A线程停止直到B线程运行结束。
static void yield()  使当前线程主动放弃其对处理器的占用,可能导致当前线程被暂停  如果没有其他线程运行,则调用该方法的线程继续运行
static void sleep(long millis)  使当前线程休眠指定时间  可以制作计时器

2.3一些废弃方法

方法 功能
stop  停止线程的运行
suspend  暂停线程的运行
resume  使被暂停的线程继续运行

2.4常见的线程

  1.main线程即main方法。

  2.http请求,一个请求就是一个线程。

  3.java虚拟机垃圾回收器通过垃圾回收线程实现。

  4.JIT编译器将字节码编译为机器码,是通过java虚拟机创建的专门的线程执行的。

2.5线程的层次关系

  A线程中的代码创建了B线程,则A线程是B线程的父线程,B为子线程。线程间的父子关系被称为线程的层次关系。父线程和子线程之间的生命周期没有必然联系,比如父线程结束后,子线程可以继续运行。

2.6线程的生命周期状态

  版本一:

  Thread.getState()查看线程状态,包括以下几种:

  NEW:已创建而未启动状态。一个线程中只会出现一次。

  RUNNABLE:可被线程调度器进行调度的状态(READY)或者正在运行的状态(RUNNING)。处于READY状态的线程也称作活跃线程

  BLOCKED:阻塞状态。一个线程可能因为阻塞式I/O操作如文件读写或者因为申请不到锁,阻塞解除即为RUNNABLE状态。

  WAITING:等待状态。能够使线程变更为WAITING状态的方法包括:Object.wait()、Thread.join()和LockSupport.park(Object)。解除WAITING状态的方法,Object.notify()/notifiAll() 和 LockSupport.unpark(Object)。

  TIMED_WAITING:带有时间限制的等待状态。在没有指定操作解除该状态达到一定时间,自动转化为RUNNABLE状态。

  TERMINATED:终止状态。包括运行结束和发生异常时。

  版本二:

  新建(new Thread)
  当创建Thread类的一个实例(对象)时,此线程进入新建状态(未被启动)。
  例如:Thread  t1=new Thread();

  就绪(runnable)
  线程已经被启动,正在等待被分配给CPU时间片,也就是说此时线程正在就绪队列中排队等候得到CPU资源。例如:t1.start();

  运行(running)
  线程获得CPU资源正在执行任务(run()方法),此时除非此线程自动放弃CPU资源或者有优先级更高的线程进入,线程将一直运行到结束。

  死亡(dead)
  当线程执行完毕或被其它线程杀死,线程就进入死亡状态,这时线程不可能再进入就绪状态等待执行。

  自然终止:正常运行run()方法后终止

  异常终止:调用stop()方法让一个线程终止运行

  堵塞(blocked)
  由于某种原因导致正在运行的线程让出CPU并暂停自己的执行,即进入堵塞状态。

  正在睡眠:用sleep(long t) 方法可使线程进入睡眠方式。一个睡眠着的线程在指定的时间过去可进入就绪状态。

  正在等待:调用wait()方法。(调用motify()方法回到就绪状态)

2.7简单运用实例

  

 public class DownloadFiles {

     public static void main(String[] args) {

         String[] urls = new String[3];
urls[0] = "http://www.xinhuanet.com//world/2016-03/09/c_128786392.htm";
urls[1] = "http://news.gmw.cn/2018-05/25/content_28959728.htm";
urls[2] = "http://gz.people.com.cn/BIG5/200190/205622/206162/15876781.html"; Thread downloadThread = null;
for(String url :urls){
downloadThread = new Thread(new FileDownloader(url));
downloadThread.start();
}
} static class FileDownloader implements Runnable{ private final String fileUrl; public FileDownloader(String url) {
this.fileUrl = url;
} @Override
public void run() {
String fileName = fileUrl.substring(fileUrl.lastIndexOf('/')+1);
try {
URL url = new URL(fileUrl);
String localFileName = System.getProperty("java.io.tmpdir")+"/viscent-"+fileName;
downloadFiles(url,new FileOutputStream(localFileName),1024);
} catch (Exception e) {
e.printStackTrace();
}
} private void downloadFiles(URL url,OutputStream outputStream,int bufSize){
try {
HttpURLConnection urlConnection=null;
//打开URL
urlConnection = (HttpURLConnection)url.openConnection();
urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36)"); //防止报403错误。
//获取服务器响应代码
int responsecode=urlConnection.getResponseCode();
if(responsecode==200){
BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(),"UTF-8"));
String content = null;
while((content = reader.readLine()) != null){
outputStream.write(content.getBytes());
}
System.out.println("下载成功");
reader.close();
urlConnection.disconnect();
}
} catch (IOException e) {
e.printStackTrace();
}
} } }

2.8多线程编程的优势和风险

  优势:1.提高系统的吞吐率,一个进程有多个并发的操作

     2.提高响应性。多线程的请求对其他请求不会产生影响。

     3.充分利用多核。

        4.最小化对系统资源的浪费。多个线程共享其所在进程所申请的资源,想比多个进程编程节约资源。

     5.简化程序的结构。

  风险:1.线程安全问题。多个线程共享数据的时候,如果没有采取相应的并发访问控制措施,可能会产生数据一致性问题、丢失更新等。

     2.线程活性问题。死锁问题,两个线程互相等待对方先释放锁,一直处于BLOCKED状态。活锁问题,一直尝试某个操作但就是没有进展,一直处于RUNNING状态。线程饥饿问题,永远无法获取处理器执行的机会,一直处于READY状态。

     3.上下文切换问题。处理器从执行一个线程转向执行另一个线程的时候,会进行上下文切换,增加系统的消耗,不利于系统的吞吐率。

     4.可靠性。单进程多线程的方式可能因为进程终止,而所有线程终止。有时可以考虑多进程多线程的方式。      

学习笔记《Java多线程编程实战指南》二的更多相关文章

  1. sql分类及基本sql操作,校对规则(mysql学习笔记二)

    sql针对操作对象分为不同语言 数据操作(管理)语言 DML或者将其细分为 ( 查询  DQL 管理(增,删,改)  DML) 数据定义语言(对保存数据的格式进行定义) DDL 数据库控制语言(针对数 ...

  2. Microsoft.SQL.Server2012.Performance.Tuning.Cookbook学习笔记(二)

    Creating trace with system stored procedures Following are the stored procedures which you should kn ...

  3. 《SQL必知必会》学习笔记二)

    <SQL必知必会>学习笔记(二) 咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语 ...

  4. 《SQL必知必会》学习笔记整理

    简介 本笔记目前已包含 <SQL必知必会>中的所有章节. 我在整理笔记时所考虑的是:在笔记记完后,当我需要查找某个知识点时,不需要到书中去找,只需查看笔记即可找到相关知识点.因此在整理笔记 ...

  5. 《SQL必知必会》学习笔记(一)

    这两天看了<SQL必知必会>第四版这本书,并照着书上做了不少实验,也对以前的概念有得新的认识,也发现以前自己有得地方理解错了.我采用的数据库是SQL Server2012.数据库中有一张比 ...

  6. 读书笔记汇总 - SQL必知必会(第4版)

    本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...

  7. SQL语法语句总结(《SQL必知必会》读书笔记)

    一.SQL语句语法 ALTER TABLE ALTER TABLE 用来更新已存在表的结构. ALTER TABLE tablename (ADD|DROP column datatype [NULL ...

  8. 【SQL必知必会笔记(1)】数据库基础、SQL、MySQL8.0.16下数据库、表的创建及数据插入

    文章目录 1.数据库基础 1.1 数据库(database) 1.2 表(table) 1.3 列和数据类型 1.4 行 1.5 主键 2.什么是SQL 3.创建后续练习所需数据库.表(MySQL8. ...

  9. 读书笔记--SQL必知必会18--视图

    读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...

  10. 学习《SQL必知必会(第4版)》中文PDF+英文PDF+代码++福达BenForta(作者)

    不管是数据分析还是Web程序开发,都会接触到数据库,SQL语法简洁,使用方式灵活,功能强大,已经成为当今程序员不可或缺的技能. 推荐学习<SQL必知必会(第4版)>,内容丰富,文字简洁明快 ...

随机推荐

  1. html页面原生video标签隐藏下载按钮

    在写web项目的时候,遇到简介页面有一个单独的简介视频,只有这一个短短的视频所以没有使用任何video组件,所以运用原生video标签就想解决问题. 虽然简介视频是非付费的,但也不希望会有下载按钮或者 ...

  2. swift4.0 数据转模型

    swift 4.0时代的到来,说明了swift已经趋于稳定了,已经完全可以入坑了. 下面就拿最简单的数据转模型来说说,实战一下. 接口使用:  http://116.211.167.106/api/l ...

  3. linux 保存git的账号密码

    今天在弄jenkins一建发版,遇到了git下载每次都要输入账号密码,所以百度一下,使用一下方法,搞定 一.通过文件方式 1.在~/下, touch创建文件 .git-credentials, 用vi ...

  4. Execute to Parse %: 29.76,数据库硬解析过高,监控告警提示数据库硬解析比例过低

    客户反馈,Oracle重启库操作后,监控告警出现pin比例低于25% 根据Oracle体系结构的理解,重启库后,硬解析及buffer命中率肯定有一段时间低. 生成不同时段的AWR报告:不要生成rac ...

  5. 学习笔记:spark Streaming的入门

    spark Streaming的入门 1.概述 spark streaming 是spark core api的一个扩展,可实现实时数据的可扩展,高吞吐量,容错流处理. 从上图可以看出,数据可以有很多 ...

  6. s21day13 python笔记

    s21day13 python笔记 一.装饰器 目的:在不改变原函数内部代码的基础上,在函数执行之前和之后自动执行某个功能 应用场景:想要为函数扩展功能时,可以选择用装饰器 装饰器基本格式: def ...

  7. E-R视图中有关图形的用法

    这里先推荐几款相对好用的画E-R图的软件: 第一款为:  这是一款在线的画流程图软件 第二款为:亿图图示 第三款为:Visio ER图是在设计数据库之前,明白数据之间的相互关系,理清数据之间的逻辑而需 ...

  8. 同时使用多个JDK版本的方法

    开发环境需要使用JDK1.8,但是有些系统仅支持JDK1.6,以下方法可满足此需求: 1.使用安装包安装JDK1.6,安装之后记得设置不自动更新,控制面板-JAVA:        2.使用免安装版J ...

  9. c++中STL容器中的排序

    1.c++STL中只有list自带了排序函数: (1).若list中存放的是int类型或者string类型,直接利用sort即可: list <int> list1;           ...

  10. CentOS官网下载系统镜像

    https://jingyan.baidu.com/article/1876c85279cedd890a13766c.html