1:后台线程(守护线程)
后台线程一半用来提供一种通用服务,不属于程序中不可或缺的部分。所有的非后台线程结束时,进程会杀死所有的后台线程。后台进程在不执行finally方法的情况下就有可能结束run方法
public class SimpleDaemos implements Runnable {
public static void main(String[] args) throws InterruptedException {
for(int i=0;i<10;i++) {
Thread daemo = new Thread(new SimpleDaemos());
daemo.setDaemon(true);
daemo.start();
}
System.out.println("All daemo started");
TimeUnit.MILLISECONDS.sleep(175);
}
public void run() {
try {
while(true) {
TimeUnit.MILLISECONDS.sleep(100);
System.out.println(Thread.currentThread() + " " + this);
}
} catch (InterruptedException e) {
System.out.println("sleep() interrupted");
}
}
}
2:ThreadFactory定制线程属性
public class DaemonFromFactory implements Runnable{
public static void main(String[] args) throws InterruptedException {
//使用一个线程工厂作为参数,创建的线程具有线程工厂的属性
ExecutorService exe = Executors.newCachedThreadPool(new DaemoThreadFactory());
for(int i=0;i<10;i++) {
exe.execute(new DaemonFromFactory());
}
System.out.println("All daemos started");
TimeUnit.MILLISECONDS.sleep(500);
}
public void run() {
}
}
/**
* 使用线程工厂创建出来的线程全部是守护线程
* @author zhuchangxin
*
*/
class DaemoThreadFactory implements ThreadFactory {
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
t.setDaemon(true);
return t;
}
}
3:join()加入一个线程
在a线程上调用b.join()。则a线程等待b执行完,然后才继续执行。如果期间调用interrupt()方法打断线程,则b线程被打断,a继续向下执行
public class Joining {
public static void main(String[] args) throws InterruptedException {
Sleeper sleepy = new Sleeper("Sleepy" , 1500);// 1
Sleeper grumpy = new Sleeper("Grumpy" , 1500);// 2
Joiner dopey = new Joiner("Dopey", sleepy);// 3
Joiner doc = new Joiner("Doc", grumpy);// 4
Thread.sleep(500);
grumpy.interrupt();
}
}
class Sleeper extends Thread {
private int duration;
public Sleeper(String name,int sleepTime) {
super(name);
this.duration = sleepTime;
start();
}
public void run() {
try {
TimeUnit.MILLISECONDS.sleep(duration);// 5
} catch (InterruptedException e) {
//调用Thread父类中的getName方法
System.out.println(getName() + " was interrupted. isInterrupted(): " + isInterrupted());
return ;
}
System.out.println(getName() + " has awakened");
}
}
class Joiner extends Thread {
private Sleeper sleeper;
public Joiner(String name,Sleeper sleeper) {
super(name);
this.sleeper = sleeper;
start();
}
public void run() {
try {
sleeper.join();
}catch (InterruptedException e) {
System.out.println("Interrupted");
}
System.out.println(getName() + " join completed");
}
}
输入结果:
Grumpy was interrupted. isInterrupted(): false
Doc join completed
Sleepy has awakened
Dopey join completed
4:捕获异常
我们无法捕获从线程中逃逸的异常,一旦异常逃出run方法,它将会向控制台输出,即便使用将main主体放到try,catch中
public class SimpleDaemos implements Runnable {
public static void main(String[] args) {
try {
for(int i=0;i<10;i++) {
Thread daemo = new Thread(new SimpleDaemos());
daemo.setDaemon(true);//设成守护线程
daemo.start();
}
System.out.println("All daemo started");
TimeUnit.MILLISECONDS.sleep(175);
} catch(Exception e) {
}
}
public void run() {
try {
throw new InterruptedException();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
控制台仍会输出异常
解决方法:可以Thread.UncaughtExceptionHandler接口,该接口在线程因未捕获的异常临近死亡时调用
public class CaptureUncaughtException {
public static void main(String[] args) {
ExecutorService exe = Executors.newCachedThreadPool(new HandlerThreadFactory());
exe.execute(new ExceptionThread2());
}
}
class ExceptionThread2 implements Runnable {
@Override
public void run() {
Thread t = Thread.currentThread();
System.out.println("run() by " + t);
System.out.println("eh = " + t.getUncaughtExceptionHandler());
throw new RuntimeException();
}
}
//创建一个线程工厂,由该工厂创建的线程使用自定义异常类作为默认的异常处理方法
class HandlerThreadFactory implements ThreadFactory {
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
t.setUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
System.out.println("eh = " + t.getUncaughtExceptionHandler());
return t;
}
}
//自定义异常类
class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println("caught " + e);
}
}
分享到:
相关推荐
"并发二:原子性、可见性、有序性" 本文主要讲解了Java内存模型(JMM)中关于并发编程的三个基本概念:原子性、可见性和有序性。 原子性 原子性是指一个操作不会被线程调度机制打断,一旦开始,就一直运行到结束...
多线程和高并发二.md
C ++中并发二进制搜索树的性能比较 该项目旨在比较C ++中二进制搜索树的几种并发实现: 跳过清单 非阻塞二叉搜索树 乐观的AVL树 无锁多路搜索树 基于计数器的树 注意:该代码仅在Intel处理器上经过测试。 与其他...
《实战Java高并发程序设计》第二版是一本深入探讨Java多线程和并发编程的书籍。这本书涵盖了Java并发编程的核心概念和技术,旨在帮助开发者在实际项目中高效地处理高并发场景。随书附带的代码提供了丰富的示例,以便...
《Java并发编程的艺术》这本书是Java开发者深入理解并发编程的重要参考书籍。这本书全面地介绍了Java平台上的并发和多线程编程技术,旨在帮助开发者解决在实际工作中遇到的并发问题,提高程序的性能和可伸缩性。 ...
### C++并发编程实践 #### 一、简介与并发编程基础 《C++并发编程实践》这本书由Anthony Williams编写,是一本深入讲解C++多线程编程技术的专业书籍。本书旨在帮助读者掌握C++中的并发编程技巧,并通过大量的示例...
《Java并发编程:设计原则与模式(第二版)》是一本深入探讨Java多线程编程技术的权威著作。这本书详细阐述了在Java平台中进行高效并发处理的关键概念、设计原则和实用模式。以下是对该书内容的一些核心知识点的概述...
在本实验"操作系统实验二并发与调度(初学者)"中,我们将深入探讨并发执行和任务调度这两个关键概念,这对于理解和开发多线程、多进程的应用程序至关重要。 并发性是指两个或多个操作在同一时间段内发生,但不一定...
java 并发变成设计原则与模式第二版 PDF版本,下载即看
步骤二:调整 IIS 的 AppConcurrentRequestLimit IIS 的 AppConcurrentRequestLimit 是指同时处理的请求数量的限制。默认情况下,IIS 的 AppConcurrentRequestLimit 为 5000,需要将其调整到 100000。可以通过输入...
《Java高并发程序设计》是一本深入探讨Java平台上的并发编程技术的专业书籍,由葛一鸣等人编著。这本书旨在帮助读者理解并掌握在高并发环境下编写高效、稳定且可扩展的Java应用程序的关键技巧和最佳实践。以下是该书...
《JAVA并发编程艺术》是Java开发者深入理解和掌握并发编程的一本重要著作,它涵盖了Java并发领域的核心概念和技术。这本书详细阐述了如何在多线程环境下有效地编写高效、可靠的代码,对于提升Java程序员的技能水平...
二、多线程技术 多线程是并发控制的基础,它允许一个应用程序同时执行多个独立的代码段。在CsGo框架中,可以使用`System.Threading.Thread`类创建和管理线程。每个线程都有自己的调用堆栈和执行上下文,使得多个...
java并发编程总结,为xmind格式,总结的很详细,包含常见的并发容器,锁等知识
《Java并发编程 设计原则与模式 第二版》是一本深受程序员喜爱的经典书籍,由Addison Wesley出版。这本书深入探讨了Java平台上的多线程编程技术,为开发者提供了丰富的设计原则和模式,帮助他们理解和解决并发环境中...
#### 二、Java线程安全问题及解决方案 ##### 2.1 线程安全问题分析 在多线程环境下,如果不加以控制,可能会出现数据竞争、死锁等问题。其中,数据竞争指的是多个线程同时访问并修改同一变量的情况,而死锁则是指两...
JAVA并发编程艺术 高清pdf : 1.并发变成的挑战 2. java并发机制的底层实现原理 3. java 内存模型 4. java并发编程基础 5.java中的锁。。。。。。。
第二部分 结构化并发应用程序 第6章 任务执行 6.1 在线程中执行任务 6.1.1 串行地执行任务 6.1.2 显式地为任务创建线程 6.1.3 无限制创建线程的不足 6.2 Executor框架 6.2.1 示例:基于Executor的Web服务器 ...
Java并发编程:设计原则与模式(第二版).pdf
#### 二、并发基础知识 本书不仅适合已经有一定Java编程经验的开发人员阅读,也适用于希望深入了解并发编程基础的新手。它从最基本的并发概念讲起,如进程与线程的区别、线程生命周期、线程调度策略等,并逐步深入到...