java多线程实战指南_学习笔记《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简单运用实例

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.可靠性。单进程多线程的方式可能因为进程终止,而所有线程终止。有时可以考虑多进程多线程的方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/267810.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

putty, puttycm区别

2019独角兽企业重金招聘Python工程师标准>>> 在windows上实现telnet, ssh等工具有几个方案可以选择, 本文总结了putty putty cm的方案, 并且简短地和 cygwin console2方案做了一下比较. 由于putty的安装 配置比较简单, 本文主要讨论了Putty cm的配置和中文的支持.…

思科网络基础之访问控制列表

loading....转载于:https://www.cnblogs.com/changha0/p/8185866.html

java编写日期_Java常用日期操作

//日期转字符串,根据需要调整格式Testpublic voidDateToString(){Date currentTime newDate();SimpleDateFormat formatter new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String dateStringformatter.format(currentTime);System.out.println(dateString);}字符串转…

使用jQuery Treeview插件实现树状结构效果

首先到一个国外网站上下载Treeview插件:http://bassistance.de/jquery-plugins/jquery-plugin-treeview/当然你也可以通过我博客的源文件直接下载:http://files.cnblogs.com/jishume/jquery_api_for_dw4.rar 为了形象一点,先看一个效果图&…

冲刺二周04

第四天: 昨天干什么:完成搜索界面 今天干什么:编写模糊查询搜索的代码 遇见什么问题:不熟悉 团队成员会议照: 转载于:https://www.cnblogs.com/ghl0518/p/8301051.html

[转]The Top 10 Attributes of a Great Programmer

With all the latest attention again on what does and doesn’t make a good programmer, I couldn’t help but put together my own top 10 list. Being a great problem solver.Being driven and lazy at the same time.Ability to understand other people’s codeHaving…

zabbix查看mysql同步_Zabbix 检测Mysql数据库的主从同步

在高并发网站架构中,MySQL数据库主从同步是不可或缺的,不过经常会发生由于网络原因或者操作错误,MySQL主从经常会出现不同步的情况,那么如何监控MySQL主从同步,也变成检测网站正常运行的重要环节。MySQL同步功能由3个线…

LeetCode String Compression

原题链接在这里:https://leetcode.com/problems/string-compression/description/ 题目: Given an array of characters, compress it in-place. The length after compression must always be smaller than or equal to the original array. Every elem…

瀑布模型 原型模型 增量模型 螺旋模型的优缺点

瀑布模型的优点:有利于大型软件开发过程中人员的组织、管理,有利于软件开发方法和工具的研究,从而提高了大型软件项目开发的质量和效率。瀑布模型的缺点:(1)开发过程一般不能逆转,否则代价太大&…

二手手机交易平台使用MYSQL的方法_安卓Android校园淘(二手交易)APP设计与实现(MySQL)...

安卓Android校园淘(二手交易)APP设计与实现(MySQL)(任务书,开题报告,中期检查表,文献综述,外文翻译,毕业论文14000字,程序代码,MySQL数据库)本项目就是一个基于Android平台的校园淘APP设计,采用了Struts技术,JDBC技术和Android的基础技术完成开发。收录了…

频繁项集-------产生强关联规则的过程

频繁项集------->产生强关联规则的过程 1.由Apriori算法(当然别的也可以)产生频繁项集 2.根据选定的频繁项集,找到它所有的非空子集 3.强关联规则需要满足最小支持度和最小置性度 (假设关联规则是:A>B &#…

ADSL之PPPOE

大家好!我是书记,今天我来小谈一下网络中的PPPOE技术。 PPPOE(Point to Point Protocol over Ethernet)以太网点到点协议,简单的说,是以太网协议和PPP协议结合后所产生的协议,是在PPP协…

java标号

标号用于控制循环执行流程&#xff1a; public static void main(String[] args) {mark:for(int i 0; i < 3; i) {System.out.printf("i %d\n", i);for (int j 0; j < 3; j) {System.out.printf("j %d\n", j);if (i 1 && j 1) {//brea…

LAMP环境下ECShop系统部署

作业环境服务器端&#xff1a;RHEL6.0 IP&#xff1a;10.8.110.8 客户端&#xff1a;Windows 7 IP&#xff1a;10.8.110.28 一、ECShop简介 ECShop是上海商派网络科技有限公司&#xff08;ShopEx&#xff09;旗下——B2C独立网店系统&#xff0c;适合企业及个人快速构建个…

date js 半年_JavaScript Date对象

Date对象源码下载最初接触编程&#xff0c;没有接触过非常讲究时间控制的领域&#xff0c;往往对时间没有概念&#xff0c;单片机编程&#xff0c;嵌入式开发&#xff0c;操作系统&#xff0c;无人及姿态控制往往会关注毫秒ms、微秒us级的时间概念。什么是并行&#xff0c;什么…

SQL Server代理的阶梯 - 第2级:作业步骤和子系列

作者&#xff1a;Richard Waymire&#xff0c;2017/10/11&#xff08;第一版&#xff1a;2011/02/17&#xff09; 原文链接&#xff1a;http://www.sqlservercentral.com/articles/SQLAgent/JobStepsandSubsystems/72268/ 该系列 本文是“Stairway系列&#xff1a;SQL Server代…

java动画闪烁_优化Java动画编程中的显示效果

Java动画编程有多种实现方法&#xff0c;但它们实现的基本原理是一样的&#xff0c;即在屏幕上画出一系列的帧来造成运动的感觉。Java多线程技术是Java动画编程中普遍运用的技术&#xff0c;它在控制动画程序的流程和动画的显示效果方面起着重要的作用。Java动画编程中的动画闪…

Visual C++ 2011-5-20

一.LockFile和UnlockFile 锁定文件部分区域&#xff0c;防止其他程序进行该部分区域的读写 #include <windows.h> #include <stdio.h>void main() {HANDLE hFile;HANDLE hAppend;DWORD dwBytesRead, dwBytesWritten, dwPos;BYTE buff[4096];// Open the existin…

如何快速将文本中的tab更换成逗号(图文详解)

不多说&#xff0c;直接上干货&#xff01; 现有一份数据如下。 下载日志数据并分析 到搜狗实验室下载用户查询日志 1) 介绍 搜索引擎查询日志库设计为包括约1个月(2008年6月)Sogou搜索引擎部分网页查询需求及用户点击情况的网页查询日志数据集合。为进行中文搜索引擎用户行为…

java中矩阵怎么打印_在Java编程中打印二维数组或矩阵

在本文中&#xff0c;我们将尝试以与通常在纸上书写相同的方式在控制台上打印数字数组或数字矩阵。为此&#xff0c;逻辑是一个接一个地访问数组的每个元素&#xff0c;并使其以空格分隔打印&#xff0c;当行到达矩阵中的emd时&#xff0c;我们还将更改行示例public class Prin…