`
ontheway_lyl
  • 浏览: 45141 次
社区版块
存档分类
最新评论

java两个线程互相守护

    博客分类:
  • java
阅读更多

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多线程的线程守护两个例子_.docx

    Java多线程中的线程守护(Daemon)是一个关键概念,主要涉及到线程的生命周期和Java虚拟机(JVM)的退出条件。守护线程与普通线程的主要区别在于,当JVM中没有非守护线程(用户线程)在运行时,JVM会自动退出,即使...

    java多线程的讲解和实战

    7. **死锁与活锁**:当两个或更多线程互相等待对方释放资源而无法继续执行时,就会发生死锁。活锁则是线程虽然没有阻塞,但由于某种原因无法执行,如不断尝试获取资源。避免死锁和活锁的关键在于设计良好的同步策略...

    java多线程Demo

    在Java中,实现多线程有两种主要方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当我们创建一个新的类,让它继承Thread类时,可以通过重写`run()`方法来定义线程执行的任务。然后创建该类的对象,并...

    JAVA-多线程 所有文件

    6. **死锁**:当两个或更多线程互相等待对方释放资源,导致无法继续执行的情况称为死锁。避免死锁是多线程编程中的重要问题。 7. **线程优先级**:Java的线程有优先级,可以通过`setPriority()`设置,但实际操作...

    java实现守护进程,有单独的监听进程, 两个或多个进程,两个或多个jvm

    总的来说,Java实现守护进程、监听进程以及管理多个进程和JVM涉及多线程、网络编程、进程间通信等多个方面,需要对Java的API有深入理解,并熟悉操作系统级别的进程管理。通过这种方式,我们可以构建出强大、灵活的...

    Java_多线程与并发编程总结.doc

    尽管用户可能感觉程序是同时运行的,但实际上由于CPU的时钟周期限制,每个时刻只能执行一个线程。通过快速地在各个线程间切换,营造出并发执行的假象,这种现象被称为上下文切换。 在多线程环境下,线程安全和同步...

    java多线程设计模式_java_设计模式_多线程_多线程课题_

    死锁是多线程编程中的常见问题,两个或多个线程互相等待对方释放资源,导致无法继续执行。Java的jstack工具可以帮助检测死锁,而在编程时应避免循环等待,合理设计锁的获取顺序,以减少死锁的风险。 以上就是Java多...

    java 多线程示例

    死锁是两个或多个线程相互等待对方释放资源而造成的僵局。避免死锁的关键在于遵循资源请求的顺序化和避免循环等待。 6. **wait(), notify(), notifyAll()** 这些方法用于线程间的通信。当一个线程调用`wait()`,...

    【java 多线程】守护线程与非守护线程的详解

    Java 中有两类线程:User Thread(用户线程)和 Daemon Thread(守护线程)。用户线程即运行在前台的线程,而守护线程是运行在后台的线程。守护线程的作用是为其他前台线程的运行提供便利服务,而且仅在普通、非守护...

    Java多线程练习题

    当两个或更多线程互相等待对方释放资源而无法继续执行时,就会发生死锁。避免死锁的方法包括避免循环等待、设置超时和使用死锁检测算法。 九、线程中断 Thread类提供了interrupt()方法用于中断线程,但是需要注意的...

    Java多线程编程核心技术_完整版_java_

    1. java.util.concurrent包下的工具类,如CountDownLatch、CyclicBarrier、Semaphore等,用于协调多个线程之间的操作。 以上内容只是《Java多线程编程核心技术》教程中的一部分核心知识点,实际学习中还需要结合...

    java多线程文件传输

    - **死锁**:当两个或更多线程互相等待对方释放资源导致无法继续执行的状态,应避免死锁的发生。 4. **并发工具类** - **CountDownLatch**:允许一个线程等待其他线程完成操作,常用于多线程并发测试。 - **...

    java多线程编程总结

    在Java中,“线程”通常指代两个不同的事物: 1. `java.lang.Thread` 类的一个实例。 2. 线程的执行。 使用 `java.lang.Thread` 类或 `java.lang.Runnable` 接口来定义、实例化和启动新线程。`Thread` 类实例...

    浅谈java中守护线程与用户线程

    Java中的线程可以分为两类,即daemon线程(守护线程)和User线程(用户线程)。守护线程是一种特殊的线程,它们的生命周期并不受主线程的影响,而用户线程则是我们可以看到的线程。 在JVM启动时,main函数所在的...

    Java 的多线程,程序、进程和线程的概念31

    在孙鑫老师的“JAVA教程”中,你将深入学习如何在Java中有效地管理和控制多线程,通过53.swf和54.swf这两个文件,你将能够逐步理解并掌握这些重要概念和技巧。在实践中,理解和运用这些知识点对于编写高性能、高并发...

    Java多线程详解及示例

    在多线程环境下,死锁是指两个或多个线程相互等待对方释放资源,导致它们都无法继续执行。活锁则是指线程不断重试获取资源,但由于其他线程持有资源不释放,导致线程陷入无限循环的状态。避免死锁和活锁的关键在于...

    java多线程编程

    当两个或更多线程互相等待对方释放资源时,会发生死锁。避免死锁的关键是避免循环等待,可以通过资源排序、避免嵌套锁等策略来预防。 5. **线程优先级** Java线程具有优先级,`Thread.NORM_PRIORITY`是默认优先级...

    java多线程的两种实现

    死锁是指两个或多个线程相互等待对方释放资源,导致所有线程都无法继续执行。活锁则是线程不断尝试获取资源但总是失败,从而导致无休止的循环。避免死锁和活锁需要合理设计资源获取顺序和超时策略。 以上是对Java...

    详解Java线程-守护线程与用户线程

    Java中的线程可以分为守护线程(DaemonThread)和用户线程(UserThread)两类。守护线程和用户线程的唯一区别是它们对虚拟机的退出(程序的终止)的影响。 当JVM中只有守护线程时,虚拟机会退出,程序终止;而当JVM中至少...

Global site tag (gtag.js) - Google Analytics