java多线程-概念&创建启动&中断&守护线程&优先级&线程状态(多线程编程之一)
今天开始就来总结一下Java多线程的基础知识点,下面是本篇的主要内容(大部分知识点参考java核心技术卷1):
- package com.zejian.test;
- /**
- * @author zejian
- * @time 2016年3月11日 下午9:57:44
- * @decrition 继承Thread实现线程
- */
- public class ThreadByEx extends Thread{
- /**
- * 重写run方法
- */
- @Override
- public void run() {
- System.out.println("I'm a thread that extends Thread!");
- }
- }
实现Runnable接口重写run方法:
- package com.zejian.test;
- /**
- * @author zejian
- * @time 2016年3月11日 下午10:00:36
- * @decrition 实现Runnable接口重写run方法
- */
- public class ThreadByRunnable implements Runnable{
- /**
- * 实现run方法
- */
- @Override
- public void run() {
- System.out.println("I'm a thread that implements Runnable !");
- }
- }
怎么启动线程?
- package com.zejian.test;
- public class MainTest {
- public static void main(String[] args) {
- //继承Thread启动的方法
- ThreadByEx t1=new ThreadByEx();
- t1.start();//启动线程
- //实现Runnable启动线程的方法
- ThreadByRunnable r = new ThreadByRunnable();
- Thread t2 =new Thread(r);
- t2.start();//启动线程
- }
- }
运行结果:
- I'm a thread that extends Thread!
- I'm a thread that implements Runnable !
- Thread.currentThread().isInterrupted()
- while(!Thread.currentThread().isInterrupted()){
- do something
- }
但是如果此时线程处于阻塞状态(sleep或者wait),就无法检查中断状态,此时会抛出如果每次迭代之后都调用sleep方法(或者其他可中断的方法),isInterrupted检测就没必要也没用处了,如果在中断状态被置位时调用sleep方法,它不会休眠反而会清除这一休眠状态并抛出InterruptedException。所以如果在循环中调用sleep,不要去检测中断状态,只需捕获InterruptedException。代码范例如下:
- while(more work to do ){
- try {
- Thread.sleep(5000);
- } catch (InterruptedException e) {
- //thread was interrupted during sleep
- e.printStackTrace();
- }finally{
- //clean up , if required
- }
- }
- void myTask(){
- ...
- try{
- sleep(50)
- }catch(InterruptedException e){
- ...
- }
- }
正确的处理方式:
- void myTask()throw InterruptedException{
- sleep(50)
- }
或者
- void myTask(){
- ...
- try{
- sleep(50)
- }catch(InterruptedException e){
- Thread.currentThread().interrupt();
- }
- }
- package com.zejian.test;
- /**
- * @author zejian
- * @time 2016年3月12日 上午10:42:19
- * @decrition 守护线程代码示例
- */
- public class Demon {
- public static void main(String[] args) {
- Thread deamon = new Thread(new DaemonRunner(),"DaemonRunner");
- //设置为守护线程
- deamon.setDaemon(true);
- deamon.start();//启动线程
- }
- static class DaemonRunner implements Runnable{
- @Override
- public void run() {
- try {
- Thread.sleep(500);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }finally{
- System.out.println("这里的代码在java虚拟机退出时并不一定会执行哦!");
- }
- }
- }
- }
os系统或者Ubuntu系统........
- 同步阻塞(Blocked):运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
(5). 死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
java多线程-概念&创建启动&中断&守护线程&优先级&线程状态(多线程编程之一)的更多相关文章
- [Xcode 实际操作]八、网络与多线程-(21)延时启动画面:使用Thread线程对象的延时方法
目录:[Swift]Xcode实际操作 本文将演示如何使用线程对象的延时方法,让线程休眠一段时间,暂停动作的执行. 在项目导航区,打开启动画面的故事板[LaunchScreen.storyboard] ...
- C#多线程实践——创建和开始使用
线程用Thread类来创建, 通过ThreadStart委托来指明方法从哪里开始运行.ThreadStart的声明如下: public delegate void ThreadStart(); 调用S ...
- shell脚本(多线程批量创建用户)
shell脚本中的多线程 很多场景中会用到多线程,例如备份数据库,有100个库,正常备份效率极其低下.有了多线程原本可能需要10个小时备份,现在分10个线程同时去干,只要一个小时就解决了.今天就介绍下 ...
- day06 Socket_线程API_线程并发安全
使用多线程实现多客户端连接服务端 流程图 服务端代码改造: package socket; import java.io.BufferedReader; import java.io.IOExcept ...
- 线程优先级,设置,setPriority()方法
package seday08.thread;/** * @author xingsir * 线程优先级 * 线程启动后纳入到线程调度,线程时刻处于被动获取CPU时间片而无法主动获取.我们可以通过调整 ...
- -1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中
本文关键词: java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait( ...
- java 多线程:Thread类常用方法:setPriority优先级、interrupt中断标记、suspend暂停与唤醒resume(已过时);daemon守护线程
常用方法: boolean isAlive() 测试此线程是否存活. boolean isDaemon() 测试此线程是否为守护程序线程. static void sleep?(long millis ...
- Java并发1——线程创建、启动、生命周期与线程控制
内容提要: 线程与进程 为什么要使用多线程/进程?线程与进程的区别?线程对比进程的优势?Java中有多进程吗? 线程的创建与启动 线程的创建有哪几种方式?它们之间有什么区别? 线程的生命周期与线程控制 ...
- Java多线程系列--“基础篇”10之 线程优先级和守护线程
概要 本章,会对守护线程和线程优先级进行介绍.涉及到的内容包括:1. 线程优先级的介绍2. 线程优先级的示例3. 守护线程的示例 转载请注明出处:http://www.cnblogs.com/skyw ...
随机推荐
- leetcode 627. Swap Salary 数据库带判断的更新操作
https://leetcode.com/problems/swap-salary/description/ 用 set keyWord = Case depentedWord when haha ...
- maya卸载不干净
AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...
- 性能测试工具LoadRunner22-LR之Analysis 简介
Analysis功能: 对测试运行结果进行查看.分析和比较 导入分析文件 注意LoadRunner Results文件和Analysis Session Files的区别.LoadRunner Res ...
- db2 存储过程参数传递--字段类型转换产生的问题
修改之前的脚本 select count(*) from dbdk.dtdkg010 A left join DBDK.DTDKG070 D ON D.PAY_NO = A.PAY_NO LEFT J ...
- Linux平台命令挂载U盘——实现数据共享
废话少说,一一道来,Linux中按照步骤来做就可以啦.(嵌入式平台) 1.先看看本地的mount信息 # mountrootfs on / type rootfs (rw)/dev/root on / ...
- jemeter+badboy录制脚本
Jmeter 是一个非常流行的性能测试工具,虽然与LoadRunner相比有很多不足,比如:它结果分析能力没有LoadRunner详细:很它的优点也有很多: l 开源,他是一款开源的免费软 ...
- linux程序分析工具介绍(一)—-”/proc”
写在最前面:在开始本文之前,笔者认为先有必要介绍一下linux下的man,如果读者手头用linux系统,直接在终端输入man man便可以看到详细的说明,我在这里简单的总结一下,man命令是用来查看l ...
- 将Spring源码转换为工程 + 导入Eclipse时缺失jar包
将源码转换为工程: 比如查看Spring事务部分的源码. 打开cmd窗口,切换到Spring-tx文件夹下,执行命令 “gradle cleanidea eclipse” . 缺失jar包: 第一步: ...
- (四)JavaScript之[break和continue]与[typeof、null、undefined]
7].break和continue /** * JavaScript 的break和continue语句 * break 跳出switch()语句 * break 用于跳出循环 * continue ...
- 栅格那点儿事(四A)---栅格的显示与渲染
栅格的显示与渲染 通过前两章的学习,应该对栅格这个东西不那么陌生了.在这一个部分,我们来看看如何展示出栅格数据最美丽的地方,在ArcGIS中栅格的显示与渲染.在进入细节之前,先来看看在ArcGIS中都 ...