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 ...
随机推荐
- std::string的split函数
刚刚要找个按空格分离std::string的函数, 结果发现了stackoverflow上的这个问题. 也没仔细看, 直接拿来一试, 靠, 不对啊, 怎么分离后多出个空字符串, 也就是 "a ...
- Java web servlet 拦截器 以登陆为例子
以登陆为例子............... public class LoginFilter implements Filter { @Override public void destroy() { ...
- webform 简单控件
html中12个表单元素添加runat="server"后称为控件 Lable 编译之后是 <span></span> 属性:CssClass 编译成 c ...
- odoo 中X2many类型的视图继承
我们知道视图的继承可以使用inherit_id,但是对于诸如one2many类型的字段,如何利用xpath继承修改其视图呢? 问题:如果直接写one2many类型的字段,会报不存在该字段的错误: 原视 ...
- MySQL黑科技用法总结(持续更新)
1.利用set插入数值 insert [into] 表名 set 列=值. 2.利用select对字段进行测试 ) ,并且有2条记录 ',num1+1的计算结果 tips:相等返回1,否则返回0 f ...
- Ecshop:后台添加新功能栏目以及管理权限设置
一.添加菜单项 打开 /admin/includes/inc_menu.php文件(后台框架左边菜单),在最后添加一行如下: $modules['17_other_menu']['sns_list'] ...
- 20145205《Java程序设计》第四次实验:Android环境搭建
实验内容 1.搭建Android环境 2.运行Android 3.修改代码,能输出学号 实验步骤 搭建Android环境 安装Android,核心是配置JDK.SDK 运行Android 总结感想: ...
- asdfsadfs
# -*- coding:utf8 -*- import os import jieba.posseg as pseg # -*- coding:utf8 -*- import os def spl ...
- Java数据校验(Bean Validation / JSR303)
文档: http://beanvalidation.org/1.1/spec/ API : http://docs.jboss.org/hibernate/beanvalidation/spec/1. ...
- (转)百度编辑器java使用
说在前面 工作中会遇到很多需要使用富文本编辑器的地方,比如我现在发布这篇文章离不开这个神器,而且现在网上编辑器太多了.记得之前,由于工作需要自己封装过一个编辑器的公共插件,是用ckeditor改版的, ...