学习笔记《Java多线程编程实战指南》二
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多线程编程实战指南》二的更多相关文章
- sql分类及基本sql操作,校对规则(mysql学习笔记二)
sql针对操作对象分为不同语言 数据操作(管理)语言 DML或者将其细分为 ( 查询 DQL 管理(增,删,改) DML) 数据定义语言(对保存数据的格式进行定义) DDL 数据库控制语言(针对数 ...
- Microsoft.SQL.Server2012.Performance.Tuning.Cookbook学习笔记(二)
Creating trace with system stored procedures Following are the stored procedures which you should kn ...
- 《SQL必知必会》学习笔记二)
<SQL必知必会>学习笔记(二) 咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语 ...
- 《SQL必知必会》学习笔记整理
简介 本笔记目前已包含 <SQL必知必会>中的所有章节. 我在整理笔记时所考虑的是:在笔记记完后,当我需要查找某个知识点时,不需要到书中去找,只需查看笔记即可找到相关知识点.因此在整理笔记 ...
- 《SQL必知必会》学习笔记(一)
这两天看了<SQL必知必会>第四版这本书,并照着书上做了不少实验,也对以前的概念有得新的认识,也发现以前自己有得地方理解错了.我采用的数据库是SQL Server2012.数据库中有一张比 ...
- 读书笔记汇总 - SQL必知必会(第4版)
本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...
- SQL语法语句总结(《SQL必知必会》读书笔记)
一.SQL语句语法 ALTER TABLE ALTER TABLE 用来更新已存在表的结构. ALTER TABLE tablename (ADD|DROP column datatype [NULL ...
- 【SQL必知必会笔记(1)】数据库基础、SQL、MySQL8.0.16下数据库、表的创建及数据插入
文章目录 1.数据库基础 1.1 数据库(database) 1.2 表(table) 1.3 列和数据类型 1.4 行 1.5 主键 2.什么是SQL 3.创建后续练习所需数据库.表(MySQL8. ...
- 读书笔记--SQL必知必会18--视图
读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...
- 学习《SQL必知必会(第4版)》中文PDF+英文PDF+代码++福达BenForta(作者)
不管是数据分析还是Web程序开发,都会接触到数据库,SQL语法简洁,使用方式灵活,功能强大,已经成为当今程序员不可或缺的技能. 推荐学习<SQL必知必会(第4版)>,内容丰富,文字简洁明快 ...
随机推荐
- TabLayout下划线指示器自适应文字宽度
解决方案1: 更新design库到28.0.0-rc01 implementation 'com.android.support:design:28.0.0-rc01' 然后在TabLayout里设置 ...
- C# Ini、Json、Xml 封装类
1.Ini是什么?(我对它的理解,用于存储用户配置信息的文件,该文件放在用户电脑...) INI文件是一个无固定标准格式的配置文件.它以简单的文字与简单的结构组成,常常使用在Windows操作系统,或 ...
- learn-ES6基础语法1-let&const
1.let ① 使用let声明的变量,所声明的变量只能在命令所在的代码块内有效. 同样在代码块内的a和c,c在代码块内就可以输出,a在代码块外就找不到了. ② 使用let命令声明的变量在域解析的时候不 ...
- idea 里自动下载私服jar一直不能下载下来
idea 里自动下载私服jar一直不能下载下来,只生成了.lastUpdated文件,检查了setting.xml文件.网络,私服,均无问题,在idea中打开Terminal窗口,在所要更新的pom. ...
- vue中的$route和$router的区别
1. $route是一个对象 可以获取当前页面的路由的路径query.params.meta等参数: 2.$router是VueRouter的一个实例对象 在options中可以获取路由的routes ...
- 自动删除Android工程中无用的资源
开发时间久了, 几个版本迭代之后, 工程中难免留下很多垃圾资源, 造成apk的包很大, 这里介绍一个工具, 可以自动扫描工程中, 没有使用的资源, 然后自动删除: 包括图片, xml, 文本等. 采用 ...
- 【leetcode】485. Max Consecutive Ones
problem 485. Max Consecutive Ones solution1: class Solution { public: int findMaxConsecutiveOnes(vec ...
- Centos7.5系统 SSH升级到7.9
SSH7.9安装 #!/bin/bash#删除旧版ssh包 危险操作,不删除也可以安装,建议跳过此操作.#rpm -e `rpm -qa | grep openssh` #安装zlib依赖包wget ...
- tensorflow 学习纪录(持续更新)
import tensorflow as tf import numpy as np #tensor = tf.constant([[1,2,3,4,5,6,7,8],[1,2,3,4,5,6,7,8 ...
- Java基于opencv实现图像数字识别(五)—腐蚀、膨胀处理
腐蚀:去除图像表面像素,将图像逐步缩小,以达到消去点状图像的效果:作用就是将图像边缘的毛刺剔除掉 膨胀:将图像表面不断扩散以达到去除小孔的效果:作用就是将目标的边缘或者是内部的坑填掉 使用相同次数的腐 ...