Java线程:线程的调度-守护线程
 
守护线程与普通线程写法上基本么啥区别,调用线程对象的方法setDaemon(true),则可以将其设置为守护线程。
 
守护线程使用的情况较少,但并非无用,举例来说,JVM的垃圾回收、内存管理等线程都是守护线程。还有就是在做数据库应用时候,使用的数据库连接池,连接池本身也包含着很多后台线程,监控连接个数、超时时间、状态等等。
 
setDaemon方法的详细说明:
public final void setDaemon(boolean on)将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java
虚拟机退出。    

  该方法必须在启动线程前调用。    

  该方法首先调用该线程的 checkAccess 方法,且不带任何参数。这可能抛出 SecurityException(在当前线程中)。    

  参数: 

    on - 如果为 true,则将该线程标记为守护线程。    

  抛出:    

    IllegalThreadStateException - 如果该线程处于活动状态。    

    SecurityException - 如果当前线程无法修改该线程。 

  另请参见: 

    isDaemon(), checkAccess()


 
/** 

* Java线程:线程的调度-守护线程 



* @author leizhimin 2009-11-4 9:02:40 

*/ 
public class Test { 

        public static void main(String[] args) { 

                Thread t1 = new MyCommon(); 

                Thread t2 = new Thread(new MyDaemon()); 

                t2.setDaemon(true);        //设置为守护线程 

                t2.start(); 

                t1.start(); 

        } 



class MyCommon extends Thread { 

        public void run() { 

                for (int i = 0; i < 5; i++) { 

                        System.out.println("线程1第" + i + "次执行!"); 

                        try { 

                                Thread.sleep(7); 

                        } catch (InterruptedException e) { 

                                e.printStackTrace(); 

                        } 

                } 

        } 



class MyDaemon implements Runnable { 

        public void run() { 

                for (long i = 0; i < 9999999L; i++) { 

                        System.out.println("后台线程第" + i + "次执行!"); 

                        try { 

                                Thread.sleep(7); 

                        } catch (InterruptedException e) { 

                                e.printStackTrace(); 

                        } 

                } 

        } 

}
 
后台线程第0次执行! 

线程1第0次执行! 

线程1第1次执行! 

后台线程第1次执行! 

后台线程第2次执行! 

线程1第2次执行! 

线程1第3次执行! 

后台线程第3次执行! 

线程1第4次执行! 

后台线程第4次执行! 

后台线程第5次执行! 

后台线程第6次执行! 

后台线程第7次执行! 

Process finished with exit code 0
 
从上面的执行结果可以看出:
前台线程是保证执行完毕的,后台线程还没有执行完毕就退出了。
 
实际上:JRE判断程序是否执行结束的标准是所有的前台执线程行完毕了,而不管后台线程的状态,因此,在使用后台县城时候一定要注意这个问题。

本文出自 “熔 岩” 博客,请务必保留此出处http://lavasoft.blog.51cto.com/62575/221845

Java线程:线程的调度-合并
 
线程的合并的含义就是将几个并行线程的线程合并为一个单线程执行,应用场景是当一个线程必须等待另一个线程执行完毕才能执行时可以使用join方法。
 
join为非静态方法,定义如下:
void join()    

    等待该线程终止。    
void join(long millis)    

    等待该线程终止的时间最长为 millis 毫秒。    
void join(long millis, int nanos)    

    等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒。
 
/** 

* Java线程:线程的调度-合并 



* @author leizhimin 2009-11-4 9:02:40 

*/ 
public class Test { 

        public static void main(String[] args) { 

                Thread t1 = new MyThread1(); 

                t1.start(); 

                for (int i = 0; i < 20; i++) { 

                        System.out.println("主线程第" + i + "次执行!"); 

                        if (i > 2) try { 

                                //t1线程合并到主线程中,主线程停止执行过程,转而执行t1线程,直到t1执行完毕后继续。 

                                t1.join(); 

                        } catch (InterruptedException e) { 

                                e.printStackTrace(); 

                        } 

                } 

        } 



class MyThread1 extends Thread { 

        public void run() { 

                for (int i = 0; i < 10; i++) { 

                        System.out.println("线程1第" + i + "次执行!"); 

                } 

        } 

}
 
主线程第0次执行! 

主线程第1次执行! 

主线程第2次执行! 

线程1第0次执行! 

主线程第3次执行! 

线程1第1次执行! 

线程1第2次执行! 

线程1第3次执行! 

线程1第4次执行! 

线程1第5次执行! 

线程1第6次执行! 

线程1第7次执行! 

线程1第8次执行! 

线程1第9次执行! 

主线程第4次执行! 

主线程第5次执行! 

主线程第6次执行! 

主线程第7次执行! 

主线程第8次执行! 

主线程第9次执行! 

主线程第10次执行! 

主线程第11次执行! 

主线程第12次执行! 

主线程第13次执行! 

主线程第14次执行! 

主线程第15次执行! 

主线程第16次执行! 

主线程第17次执行! 

主线程第18次执行! 

主线程第19次执行! 

Process finished with exit code 0

本文出自 “熔 岩” 博客,请务必保留此出处http://lavasoft.blog.51cto.com/62575/221817

Java5中,添加了障碍器类,为了适应一种新的设计需求,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有子任务都执行完成时候,才能执行主任务,这时候,就可以选择障碍器了。
 
障碍器是多线程并发控制的一种手段,用法很简单。下面给个例子:
 
import java.util.concurrent.BrokenBarrierException; 
import java.util.concurrent.CyclicBarrier; 

/** 

* Java线程:新特征-障碍器 



* @author leizhimin 2009-11-6 10:50:10 

*/ 
public class Test { 

        public static void main(String[] args) { 

                //创建障碍器,并设置MainTask为所有定数量的线程都达到障碍点时候所要执行的任务(Runnable) 

                CyclicBarrier cb = new CyclicBarrier(7, new MainTask()); 

                new SubTask("A", cb).start(); 

                new SubTask("B", cb).start(); 

                new SubTask("C", cb).start(); 

                new SubTask("D", cb).start(); 

                new SubTask("E", cb).start(); 

                new SubTask("F", cb).start(); 

                new SubTask("G", cb).start(); 

        } 



/** 

* 主任务 

*/ 
class MainTask implements Runnable { 

        public void run() { 

                System.out.println(">>>>主任务执行了!<<<<"); 

        } 



/** 

* 子任务 

*/ 
class SubTask extends Thread { 

        private String name; 

        private CyclicBarrier cb; 

        SubTask(String name, CyclicBarrier cb) { 

                this.name = name; 

                this.cb = cb; 

        } 

        public void run() { 

                System.out.println("[子任务" + name + "]开始执行了!"); 

                for (int i = 0; i < 999999; i++) ;    //模拟耗时的任务 

                System.out.println("[子任务" + name + "]开始执行完成了,并通知障碍器已经完成!"); 

                try { 

                        //通知障碍器已经完成 

                        cb.await(); 

                } catch (InterruptedException e) { 

                        e.printStackTrace(); 

                } catch (BrokenBarrierException e) { 

                        e.printStackTrace(); 

                } 

        } 

}
 
运行结果:
[子任务E]开始执行了! 

[子任务E]开始执行完成了,并通知障碍器已经完成! 

[子任务F]开始执行了! 

[子任务G]开始执行了! 

[子任务F]开始执行完成了,并通知障碍器已经完成! 

[子任务G]开始执行完成了,并通知障碍器已经完成! 

[子任务C]开始执行了! 

[子任务B]开始执行了! 

[子任务C]开始执行完成了,并通知障碍器已经完成! 

[子任务D]开始执行了! 

[子任务A]开始执行了! 

[子任务D]开始执行完成了,并通知障碍器已经完成! 

[子任务B]开始执行完成了,并通知障碍器已经完成! 

[子任务A]开始执行完成了,并通知障碍器已经完成! 

>>>>主任务执行了!<<<< 

Process finished with exit code 0
 
从执行结果可以看出,所有子任务完成的时候,主任务执行了,达到了控制的目标。

本文出自 “熔 岩” 博客,请务必保留此出处http://lavasoft.blog.51cto.com/62575/222738

Java线程是Java语言中一个非常重要的部分,Java5之前,多线程的语言支持还是比较弱的,内容也较少,写一个复杂的多线程程序是相当有挑战性的。
 
在Java5以后,Java对多线程做了很多扩展,扩展部分称之为并发包。这部分内容大大增强了Java多线程编程的能力,通过使用Java5线程新特征的API,可以很容易的做出复杂的多线程程序。与其他语言相比,已经是相当强悍了。
 
通过十多篇博文,将Java多线程的方方面面过了一遍,对我来说是一个学习和提高的过程,也为Java线程系列博文能给后来的学习者带来便利。
 
知识点都过了一遍,要总结起来感觉很困难,毕竟Java线程是一个庞大的话题,不知道从何说起,如果泛泛而谈,那总结还有什么意义呢,再次,将前面的博文串联起来,按照先后顺序加上链接,以方便浏览也最好的首尾。
 
下面是Java线程系列博文的一个编目:
 

Java线程:新特征-锁(上)

Java线程:大总结

 
 
 
另外,在网上看到两篇不错的博文,可以参考参考:

本文出自 “熔 岩” 博客,请务必保留此出处http://lavasoft.blog.51cto.com/62575/222742

Java线程:线程的调度-守护线程——Java线程:线程的调度-合并——Java线程:新特征-障碍器——Java线程:大总结的更多相关文章

  1. 转:【Java并发编程】之二十二:并发新特性—障碍器CyclicBarrier(含代码)

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17512983 CyclicBarrier(又叫障碍器)同样是Java5中加入的新特性,使用 ...

  2. 【Java并发编程】:并发新特性—障碍器CyclicBarrier

    CyclicBarrier(又叫障碍器)同样是Java5中加入的新特性,使用时需要导入Java.util.concurrent.CylicBarrier.它适用于这样一种情况:你希望创建一组任务,它们 ...

  3. Java线程新特征——Java并发库

    一.线程池   Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利.为了编写高效稳定 ...

  4. (转)Java线程:新特征-原子量,障碍器

    Java线程:新特征-原子量   所谓的原子量即操作变量的操作是“原子的”,该操作不可再分,因此是线程安全的.   为何要使用原子变量呢,原因是多个线程对单个变量操作也会引起一些问题.在Java5之前 ...

  5. Java线程:新特征-线程池

    Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利.为了编写高效稳定可靠的多线程程序 ...

  6. (转)Java线程:新特征-线程池

    Java线程:新特征-线程池   Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利 ...

  7. Java多线程-新特征-阻塞栈LinkedBlockingDeque

    对于阻塞栈,与阻塞队列相似.不同点在于栈是“后入先出”的结构,每次操作的是栈顶,而队列是“先进先出”的结构,每次操作的是队列头. 这里要特别说明一点的是,阻塞栈是Java6的新特征.. Java为阻塞 ...

  8. Java多线程-线程的调度(守护线程)

    本文转自http://www.cnblogs.com/linjiqin/p/3210004.html 感谢作者 守护线程与普通线程写法上基本没啥区别,调用线程对象的方法setDaemon(true), ...

  9. Java多线程系列 基础篇03 线程的优先级和守护线程

    1. 线程优先级 现代操作系统中基本上使用时间分片的方式调度线程,通过设置线程优先级,使优先级高的线程获得时间片的次数多于优先级低的线程. 在java 线程中,通过一个整形变量prority来控制优先 ...

  10. JAVA并发实现四(守护线程和线程阻塞)

    守护线程     Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) 用户线程即运行在前台的线程,而守护线程是运行在后台的线程. 守护线程作用是为其他前台 ...

随机推荐

  1. AD LDAP

    Ref: Windows 域之 LDAP与AD [安全科普]AD域安全协议(三)LDAP AD 域服务简介(一)- 基于 LDAP 的 AD 域服务器搭建及其使用 https://milestone- ...

  2. 填坑 Plugin 'mysql_native_password' is not loaded

    数据库从 mysql5.7 升级到 mysql8.4,部分场景出现以下错误提示:Plugin 'mysql_native_password' is not loaded 原因是:mysql_nativ ...

  3. 消息队列初见:一起聊聊引入系统mq 之后的问题

    消息队列前文目录 消息队列初见:一起聊聊引入系统mq 之后的问题 https://www.cnblogs.com/yizhiamumu/p/16573472.html 分布式事务实战方案汇总 http ...

  4. Maya 2019.2 Mtoa 无法正常加载并报错

    事件起因: 在开始安装 Maya2019.2 时自动安装的 Mtoa 的版本为 5.3.1,但是在插件管理器里无法启用插件,于是乎去网上下了一个低的版本 5.1.1,虽然可以使用但是渲染出来的东西不能 ...

  5. mysql-存储过程(1) mysql循环语句

    mysql循环语句: 本文总结了mysql常见的三种循环方式:while.repeat和loop循环.还有一种goto,不推荐使用. 一.while循环 delimiter // #定义标识符为双斜杠 ...

  6. USB ncm虚拟网卡

    NCM介绍 1 功能 USB NCM,属于USB-IF定义的CDC(Communication Device Class)下的一个子类:Network Control Model,用于Host和Dev ...

  7. 2023年11月中国数据库排行榜:OPO组合持续两月,亚信、中兴闯进前十

    长夜之中蓄力待,势如破晓初光披. 2023年11月的 墨天轮中国数据库流行度排行 火热出炉,本月共有283个数据库参与排名.本月排行榜前十名变动较大,TiDB 上升一位居第4,达梦奋勇向前重归第6,亚 ...

  8. Android复习(二)应用资源——>更多类型

    更多资源类型 本页面定义了更多类型的可具体化的资源,包括: Bool 带有布尔值的 XML 资源. 颜色 带有颜色值(十六进制颜色)的 XML 资源. 尺寸 带有尺寸值(包含度量单位)的 XML 资源 ...

  9. 两小时学会使用dubbo(直接API、spring、注解、springboot)

    最近上新的项目中需要用到dubbo,于是我决定温故知新,决定分享一下Dubbo在各种环境下的使用方式,本篇文章让你两小时就能学会使用dubbo 什么是Dubbo Dubbo是一个分布式.高性能.透明化 ...

  10. Linux命令netstat查看端口使用方法

    [redis@fgedu180 ~]$ netstat -an|grep 6379 tcp 0 0 192.168.4.180:6379 0.0.0.0:* LISTEN