Java多线程开发系列之四:玩转多线程(线程的控制1)
在前文中我们已经学习了:线程的基本情况、如何创建多线程、线程的生命周期。利用已有知识我们已经可以写出如何利用多线程处理大量任务这样简单的程序。但是当应用场景复杂时,我们还需要从管理控制入手,更好的操纵多线程。在第一节中我们讲过,使用多线程的好处之一就是我们可以通过编码和已有类库更好的管理和控制多线程。接下来我会详细的介绍如何管理多线程,包括:对线程的等待、守护线程、线程的睡眠、线程的突然停止、线程的让步、线程的优先级等。由于内容比较多,本节先介绍前两部分:对线程的等待、守护线程
1、线程的等待
我们常常对同一件事情进行切割,分成多干件小的事情后,再开辟多条线程来处理(有点分治的味道)。在多件事情处理完成之后我们需要再统一的处理。这样说有点枯燥:比如我们要导出一份文件,这个文件的行数非常多大概几十万行数据。直接导出也可以,会导致系统卡一下,严重一点的可能会超时。这时候怎么办呢?我们可以分成若干份,比如每五千条数据是一份数据,然后用一条线程去导出到文件中,这样就会生成若干份文件。当所有的文件都导出后,我们把这些数据汇总一下就OK了。但是这里有一个问题,什么时候所有线程都导完数据了呢?我们总不能一个一个的去检查文件是否存在吧。
这里java为我们提供了一个专门用于等待的方法Join().当某条线程执行了其他线程的join()方法以后,当前线程就会阻塞,直到其他线程执行结束以后,才可以运行。
如下述代码:
public class newThread extends Thread
{
public newThread(String name)
{
super(name);
}
public void run()
{
int i=100;
while(i-->0)
{
sleep(100);
}
} public static void main(String args)throws Exception
{
Thread son_1=new newThread("thread-1");
Thread son_2=new newThread("thread-2");
son_1.start();
son_2.start();
son_1.join();//注意这里
son_2.join();
System.out.println("all threads is over")
}
}
我们分别启动thread 1 和thread 2。这两条线程会分别运行,互相不影响,然后我们用主线程来等待线程1,直到它结束,我们才开始等待线程2。如果线程1比线程2的用时长的话,再我们等待完线程1 后,线程2将无需等待,直接输出结果。
join方法共有三种形式的重载
join()
join(long millis)//
join(long millis,int nanos)//millis 毫秒 nanos微秒
第一个方法时直到等待线程结束才继续向下运行,第二和第三个方法则是在限定时间内等待,如果时间结束将不会继续等待(可以用于超时判断),注意第三个方法并不常用,这里主要是因为java和硬件对时间的把控根本难以精确到微秒级,所以并不能很准确到控制。
2、守护线程
守护线程(Daemon Thread)又叫做精灵线程、后台线程。乍一听守护二字,觉得好像很厉害的意思,像是在保护其他线程的线程,其实很简单,并没有那么玄。所有的语言设计,都是为了更方便的使用。(防盗连接:本文首发自王若伊_恩赐解脱http://www.cnblogs.com/jilodream/ )
设想这样一个场景:在一个考场内,考生们都在埋头答卷,除了考生,还有监考老师,他的职责就是为了维护考场的秩序,对于有困难的考生提供帮助。当所有的考生都交卷后(或者时间到了以后,考生被强制交卷(结束线程)),这个监考老师的义务已经完成,无需继续运行。简而言之,这个监考老师是为了其他学生提供后台服务的,当所有的考生都已经停笔后,老师的义务也已经结束了,可以退场了。
有些人看到这里,可能会觉得,这还不简单,我们只要如线程等待让老师等待所有的学生都结束之后,不就可以了么?!这个回答对也不对。对的是老师的线程的确是在等待学生线程结束,不对的地方是老师线程在等待的同时,还在提供服务,并不是所有学生停笔后收卷这么简单。在Jvm中有一个所有开发者都熟悉的线程GC,它就是在其他线程运行的同时,默默的提供服务,当其他线程结束后,他又默默的退场。
如下代码
public class newThread extends Thread
{
public newThread(String name)
{
super(name);
}
public void run()
{
int i=100;
while(i-->0)
{
sleep(100);
}
} public static void main(String args)throws Exception
{
Thread son_1=new newThread("thread-1");
Thread son_2=new newThread("thread-2");
Thread daemonThread=new newThread("thread-daemonThread");
son_1.start();
son_2.start(); daemonThread.setDaemon(true);//注意看这里
daemonThread.start();
son_1.join();
son_2.join();
System.out.println("all son_threads is over")
}
} class DaemonThread
{
public DaemonThread(String name)
{
super(name);
}
public void run()
{
int i=1000;
while(i-->0)
{
sleep(100);
}
}
}
在代码中 Daemonthread线程被设置为后台线程,则当主线程等待子线程结束后, Daemonthread线程也会结束,不会继续运行。我们可以用这种方式设置一种线程,专门用来维护其他线程的正常运行,比如后台计数,计时,查询各个客户端是否保持在线(心跳),推送事件等。
java还专门提供了 IsDaemon()的方法来判断这个线程是否为后台线程。
这里有一点注意的是,如果要设置一个线程为后台线程,必须要在这个线程还没有开始“就绪”(start())时设置,否则会引发非法的线程状态异常
Java多线程开发系列之四:玩转多线程(线程的控制1)的更多相关文章
- Java多线程开发系列之一:走进多线程
对编程语言的基础知识:分支.选择.循环.面向对象等基本概念理解后,我们需要对java高级编程有一定的学习,这里不可避免的要接触到多线程开发. 由于多线程开发整体的系统比较大,我会写一个系列的文章总结介 ...
- Java多线程开发系列之四:玩转多线程(线程的控制2)
在上节的线程控制(详情点击这里)中,我们讲解了线程的等待join().守护线程.本节我们将会把剩下的线程控制内容一并讲完,主要内容有线程的睡眠.让步.优先级.挂起和恢复.停止等. 废话不多说,我们直接 ...
- Java多线程开发系列之番外篇:事件派发线程---EventDispatchThread
事件派发线程是java Swing开发中重要的知识点,在安卓app开发中,也是非常重要的一点.今天我们在多线程开发中,穿插进来这个线程.分别从线程的来由.原理和使用方法三个方面来学习事件派发线程. 一 ...
- Java SE开发系列-JDK下载安装
JDK下载安装 JDK是Java的开发环境,目前JDK内部也包含了JRE,JRE主要是JAVA程序的运行环境. 点击官方下载地址,按着下图操作即可下载对应系统的不同版本JDK. 进入页面滑到页面底部点 ...
- java高并发系列 - 第9天:用户线程和守护线程
守护线程是一种特殊的线程,在后台默默地完成一些系统性的服务,比如垃圾回收线程.JIT线程都是守护线程.与之对应的是用户线程,用户线程可以理解为是系统的工作线程,它会完成这个程序需要完成的业务操作.如果 ...
- Java多线程开发系列之二:如何创建多线程
前文已介绍过多线程的基本知识了,比如什么是多线程,什么又是进程,为什么要使用多线程等等. 在了解了软件开发中使用多线程的基本常识后,我们今天来聊聊如何简单的使用多线程. 在Java中创建多线程的方式有 ...
- Java多线程开发系列之三:线程这一辈子(线程的生命周期)
前文中已经提到了,关于多线程的基础知识和多线程的创建.但是如果想要很好的管理多线程,一定要对线程的生命周期有一个整体概念.本节即对线程的一生进行介绍,让大家对线程的各个时段的状态有一定了解. 线程的一 ...
- Java多线程开发系列之五:Springboot 中异步请求方法的使用
Springboot 中异步线程的使用在过往的后台开发中,我们往往使用java自带的线程或线程池,来进行异步的调用.这对于效果来说没什么,甚至可以让开发人员对底层的状况更清晰,但是对于代码的易读性和可 ...
- Windows多线程同步系列之四-----信号量
信号量说实话自己没怎么使用过.书上大概这样说,信号量设置一个资源访问计数.当该计数值大于0的时候,该信号量对象 为有信号状态,当该计数值等于0的时候,该信号量对象为无信号状态. 我们来查几个主要的AP ...
随机推荐
- bzoj 2753: [SCOI2012] 滑雪与时间胶囊 Label:MST
题目描述 a180285非常喜欢滑雪.他来到一座雪山,这里分布着M条供滑行的轨道和N个轨道之间的交点(同时也是景点),而且每个景点都有一编号i(1<=i<=N)和一高度Hi.a180285 ...
- NOIp #2009
http://files.cnblogs.com/files/radiumlrb/NOIP2009%E6%8F%90%E9%AB%98%E7%BB%84%E5%A4%8D%E8%B5%9B%E8%AF ...
- List集合特有的迭代器 ListIterator
- 初用idea建立javaweb遇到的问题与心得
1.直接用idea建立的web项目,其自动生成的web.xml里version=3.1,这样的话建立servlet-name等标签会报错(因为3.1不支持这种做法,更提倡用注解的办法),解决办法是将w ...
- Android四大组件之actiivity
1.Acitivity Activity是Android一个非常重要的用户接口(四大组件之一),是可见的,主要是用户和应用程序之间进行交互的接口.在每个Activity中都可以放很多控件,所以也可以把 ...
- Android组件安全
今天在看有关Android组件安全的东西 1.Activity Android系统组件在指定Intent过滤器(intent-filter)后,默认是可以被外部程序(签名不同,用户ID不同)访问的,在 ...
- Robot Framework 的安装和配置(转载)
Robot Framework 的安装和配置 在使用 RF(Rebot framework)的时候需要 Python 或 Jython 环境,具体可根据自己的需求来确定.本文以在有 Python 的环 ...
- InnoDB杂记
一.InnoDB写数据流程(猜想) myisam是将索引放入内存缓存(Key Cache,大小有key_buffer_size设置) innodb时间索引和数据文件都放入内存缓存池(Buffer Po ...
- VC中对文件的读写
http://www.cnblogs.com/LJWJL/archive/2012/10/06/2712466.html 注意: 1.由于C是缓冲写 所以要在关闭或刷新后才能看到文件内容 2.电脑处理 ...
- 关于iOS热修复(HotPatch)技术的使用总结
苹果做了非常多的努力来建造和维持一个健康并且干净的应用环境.其中对现在的现状起到很大作用的部分就是苹果APP STORE,它是被一个十分周密的对所有提交的应用进行检查的审批程序所保护的.尽管这个程序是 ...