dota打累了写个小demo
最近由于工作需要,需要实现一个线程无论任何情况下都不能挂掉,就算挂掉了也必须继续运行该线程里的功能,想了一下其实也非常简单,无非就是两个线程互相守护,两个线程里实现同样的功能,线程A挂了启动线程B,线程B挂了启动线程A,好了废话不多说,直接上代码:
package com.thread.daemon.test; import java.util.ArrayList; import java.util.List; /** * 两个线程互相守护,线程A挂了启动线程B,线程B挂了启动线程A * @author liangjian */ public class ThreadDaemonTest { static List<String> list = new ArrayList<>(); static Thread threadA ; static Thread threadB ; public static void threadDaemonA(){ threadA = new Thread(new Runnable() { boolean flag = true; int count = 0; @Override public void run() { threadA.setName("threadDaemonA "); while(flag){ try { threadA.sleep(1000); } catch (InterruptedException e1) { e1.printStackTrace(); flag = false; Thread.currentThread().interrupt(); threadA = null; threadDaemonB(); }finally{ } count++; System.out.println(threadA.getName()+count+ " <--> threadB = "+threadB); if(count == 10){ System.err.println(count); try { String temp = list.get(0); } catch (Exception e) { e.printStackTrace(); threadDaemonB(); flag = false; Thread.currentThread().interrupt(); threadA = null; return; }finally{ } } } } }); threadA.start(); } public static void threadDaemonB(){ threadB = new Thread(new Runnable() { boolean flag = true; int count = 0; @Override public void run() { threadB.setName("threadDaemonB "); while(flag){ try { threadB.sleep(1000); } catch (InterruptedException e1) { e1.printStackTrace(); flag = false; Thread.currentThread().interrupt(); threadB = null; threadDaemonA(); } count++; System.out.println(threadB.getName()+count+" <--> threadA = "+threadA); if(count == 10){ try { String temp = list.get(0); return ; } catch (Exception e) { e.printStackTrace(); flag = false; threadB = null; Thread.currentThread().interrupt(); threadDaemonA(); }finally{ } } } } }); threadB.start(); } public static void main(String[] args) { threadDaemonA(); } }
相关推荐
Java多线程中的线程守护(Daemon)是一个关键概念,主要涉及到线程的生命周期和Java虚拟机(JVM)的退出条件。守护线程与普通线程的主要区别在于,当JVM中没有非守护线程(用户线程)在运行时,JVM会自动退出,即使...
7. **死锁与活锁**:当两个或更多线程互相等待对方释放资源而无法继续执行时,就会发生死锁。活锁则是线程虽然没有阻塞,但由于某种原因无法执行,如不断尝试获取资源。避免死锁和活锁的关键在于设计良好的同步策略...
在Java中,实现多线程有两种主要方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当我们创建一个新的类,让它继承Thread类时,可以通过重写`run()`方法来定义线程执行的任务。然后创建该类的对象,并...
6. **死锁**:当两个或更多线程互相等待对方释放资源,导致无法继续执行的情况称为死锁。避免死锁是多线程编程中的重要问题。 7. **线程优先级**:Java的线程有优先级,可以通过`setPriority()`设置,但实际操作...
总的来说,Java实现守护进程、监听进程以及管理多个进程和JVM涉及多线程、网络编程、进程间通信等多个方面,需要对Java的API有深入理解,并熟悉操作系统级别的进程管理。通过这种方式,我们可以构建出强大、灵活的...
尽管用户可能感觉程序是同时运行的,但实际上由于CPU的时钟周期限制,每个时刻只能执行一个线程。通过快速地在各个线程间切换,营造出并发执行的假象,这种现象被称为上下文切换。 在多线程环境下,线程安全和同步...
死锁是多线程编程中的常见问题,两个或多个线程互相等待对方释放资源,导致无法继续执行。Java的jstack工具可以帮助检测死锁,而在编程时应避免循环等待,合理设计锁的获取顺序,以减少死锁的风险。 以上就是Java多...
死锁是两个或多个线程相互等待对方释放资源而造成的僵局。避免死锁的关键在于遵循资源请求的顺序化和避免循环等待。 6. **wait(), notify(), notifyAll()** 这些方法用于线程间的通信。当一个线程调用`wait()`,...
Java 中有两类线程:User Thread(用户线程)和 Daemon Thread(守护线程)。用户线程即运行在前台的线程,而守护线程是运行在后台的线程。守护线程的作用是为其他前台线程的运行提供便利服务,而且仅在普通、非守护...
当两个或更多线程互相等待对方释放资源而无法继续执行时,就会发生死锁。避免死锁的方法包括避免循环等待、设置超时和使用死锁检测算法。 九、线程中断 Thread类提供了interrupt()方法用于中断线程,但是需要注意的...
1. java.util.concurrent包下的工具类,如CountDownLatch、CyclicBarrier、Semaphore等,用于协调多个线程之间的操作。 以上内容只是《Java多线程编程核心技术》教程中的一部分核心知识点,实际学习中还需要结合...
- **死锁**:当两个或更多线程互相等待对方释放资源导致无法继续执行的状态,应避免死锁的发生。 4. **并发工具类** - **CountDownLatch**:允许一个线程等待其他线程完成操作,常用于多线程并发测试。 - **...
在Java中,“线程”通常指代两个不同的事物: 1. `java.lang.Thread` 类的一个实例。 2. 线程的执行。 使用 `java.lang.Thread` 类或 `java.lang.Runnable` 接口来定义、实例化和启动新线程。`Thread` 类实例...
Java中的线程可以分为两类,即daemon线程(守护线程)和User线程(用户线程)。守护线程是一种特殊的线程,它们的生命周期并不受主线程的影响,而用户线程则是我们可以看到的线程。 在JVM启动时,main函数所在的...
在孙鑫老师的“JAVA教程”中,你将深入学习如何在Java中有效地管理和控制多线程,通过53.swf和54.swf这两个文件,你将能够逐步理解并掌握这些重要概念和技巧。在实践中,理解和运用这些知识点对于编写高性能、高并发...
在多线程环境下,死锁是指两个或多个线程相互等待对方释放资源,导致它们都无法继续执行。活锁则是指线程不断重试获取资源,但由于其他线程持有资源不释放,导致线程陷入无限循环的状态。避免死锁和活锁的关键在于...
当两个或更多线程互相等待对方释放资源时,会发生死锁。避免死锁的关键是避免循环等待,可以通过资源排序、避免嵌套锁等策略来预防。 5. **线程优先级** Java线程具有优先级,`Thread.NORM_PRIORITY`是默认优先级...
死锁是指两个或多个线程相互等待对方释放资源,导致所有线程都无法继续执行。活锁则是线程不断尝试获取资源但总是失败,从而导致无休止的循环。避免死锁和活锁需要合理设计资源获取顺序和超时策略。 以上是对Java...
Java中的线程可以分为守护线程(DaemonThread)和用户线程(UserThread)两类。守护线程和用户线程的唯一区别是它们对虚拟机的退出(程序的终止)的影响。 当JVM中只有守护线程时,虚拟机会退出,程序终止;而当JVM中至少...