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简单运用实例

1 public classDownloadFiles {2

3 public static voidmain(String[] args) {4

5 String[] urls = new String[3];6 urls[0] = "http://www.xinhuanet.com//world/2016-03/09/c_128786392.htm";7 urls[1] = "http://news.gmw.cn/2018-05/25/content_28959728.htm";8 urls[2] = "http://gz.people.com.cn/BIG5/200190/205622/206162/15876781.html";9

10 Thread downloadThread = null;11 for(String url :urls){12 downloadThread = new Thread(newFileDownloader(url));13 downloadThread.start();14 }15 }16

17 static class FileDownloader implementsRunnable{18

19 private finalString fileUrl;20

21 publicFileDownloader(String url) {22 this.fileUrl =url;23 }24

25 @Override26 public voidrun() {27 String fileName = fileUrl.substring(fileUrl.lastIndexOf('/')+1);28 try{29 URL url = newURL(fileUrl);30 String localFileName = System.getProperty("java.io.tmpdir")+"/viscent-"+fileName;31 downloadFiles(url,new FileOutputStream(localFileName),1024);32 } catch(Exception e) {33 e.printStackTrace();34 }35 }36

37 private void downloadFiles(URL url,OutputStream outputStream,intbufSize){38 try{39 HttpURLConnection urlConnection=null;40 //打开URL

41 urlConnection =(HttpURLConnection)url.openConnection();42 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错误。43 //获取服务器响应代码

44 int responsecode=urlConnection.getResponseCode();45 if(responsecode==200){46 BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(),"UTF-8"));47 String content = null;48 while((content = reader.readLine()) != null){49 outputStream.write(content.getBytes());50 }51 System.out.println("下载成功");52 reader.close();53 urlConnection.disconnect();54 }55 } catch(IOException e) {56 e.printStackTrace();57 }58 }59

60 }61

62 }

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

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

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

3.充分利用多核。

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

5.简化程序的结构。

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

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

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

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

java多线程实战指南_学习笔记《Java多线程编程实战指南》二相关推荐

  1. python3《机器学习实战系列》学习笔记----3.2 决策树实战

    前言 一.ID3算法构造决策树 1.1 背景 1.2 信息增益计算 1.3 递归生成决策树 二.使用Matplotlib注解绘制树形图 2.1 Matplotlib注解 2.2 构造注解树 三.测试和 ...

  2. java extern的作用_学习笔记之20-static和extern关键字2-对变量的作用

    上一讲介绍了static和extern对函数的作用,static用来定义一个内部函数,不允许其他文件访问:extern用来定义和声明一个外部函数,允许其他文件访问.static和extern对变量也有 ...

  3. excelexportentity中设置null不显示的方法_学习笔记-Java中的$符

    JavaEE中$符号出现在两个地方,一个是前端jQuery中的$(),一个是后端JSP中的EL表达式${}. 一.$()中放不同的东西代表不同的含义,(1)$(function(){}),表示文档加载 ...

  4. Java 线程同步与死锁 学习笔记

    Java 线程同步与死锁 学习笔记 Java 线程同步与死锁 学习笔记 1 多线程共享数据 2 线程同步 3 同步准则 4 线程死锁 1. 多线程共享数据 在多线程操作中,多个线程可能同时处理同一个资 ...

  5. java第十九次学习笔记

    java第十九次学习笔记 异常 java第十九次学习笔记 前言 一.try catch 二.多个异常如何处理 前言 斯人若彩虹遇上方知有 一.try catch package Demo01;impo ...

  6. Java之多线程学习笔记五 —— 多线程模拟龟兔赛跑

    Java之多线程学习笔记五 -- 多线程模拟龟兔赛跑 参考教程B站狂神https://www.bilibili.com/video/BV1V4411p7EF package pers.ylw.less ...

  7. 拉勾网《32个Java面试必考点》学习笔记之一------Java职业发展路径

    本文为拉勾网<32个Java面试必考点>学习笔记.只是对视频内容进行简单整理,详细内容还请自行观看视频<32个Java面试必考点>.若本文侵犯了相关所有者的权益,请联系:txz ...

  8. Java开发面试高频考点学习笔记(每日更新)

    Java开发面试高频考点学习笔记(每日更新) 1.深拷贝和浅拷贝 2.接口和抽象类的区别 3.java的内存是怎么分配的 4.java中的泛型是什么?类型擦除是什么? 5.Java中的反射是什么 6. ...

  9. Java虚拟机(JVM)学习笔记(不定时更新)

    Java虚拟机(JVM)学习笔记 不少组织都曾开发过Java虚拟机: SUN公司曾经使用过3个虚拟机,Classic.Exact VM.Hotspot.     其中Hotspot虚拟机沿用至今,并已 ...

最新文章

  1. linux mysql统计次数_MySQL统计函数记录
  2. Spring 如何在一个事务中开启另一个事务?
  3. 关于课程设计、毕业设计的一些总结与思考
  4. 1.8 小飞的电梯调度算法
  5. 扬州ns服务器维修视频,NS连接服务器报错问题解决方法--给遇到同样问题的盆友...
  6. Kali linux安装漏洞扫描工具Nessus安装指南
  7. Android架构师谈:View-Pager-性能优化之-无限循环
  8. Oracle RAC FTA
  9. python数组拼接concat_【JavaScript】重写数组的concat()方法
  10. 【DCVRP】基于matlab蚁群算法求解带容量+距离的车辆路径规划问题【含Matlab源码 1038期】
  11. Javascript框架设计思路图
  12. 用word模仿手写字体
  13. 2020神舟几号发射_今年将发射神舟十一号载人飞船 2020年将建成载人空间站
  14. 机械硬盘和固态硬盘 检测 案例 ST4000VX015
  15. JAVA_观察者模式例子
  16. 品优购项目——黑马程序员pink老师/完整源代码/项目讲解
  17. 青花瓷音乐的单片机c语言程序,c语言曲谱_单片机c语言音乐简谱代码
  18. androidnbsp;关机闹钟
  19. 【区块链技术前沿】可下载内容与NFT
  20. 分布式闭锁-redisson的闭锁应用

热门文章

  1. CSS3 2D Transform
  2. 20个简约风格网站设计作品欣赏
  3. BundleFusion那些事儿
  4. halcon1D测量算子,持续更新
  5. 【pyqt5学习】——给窗口添加图标
  6. java安全权限配置_使用Spring安全表达式控制系统功能访问权限问题
  7. mysql 时间 本周 本月_mysql查询当天、本周、上周、本月、上月信息
  8. java 字体名字_JAVA:获取系统中可用的字体的名字
  9. AOP联盟通知类型和Spring编写代理半自动
  10. 几种经典的数据排序及其Java实现