`
嵇海波
  • 浏览: 14110 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

java 守护线程

阅读更多

java守护线程的定义:

     1.所谓守护线程就是运行在程序后台的线程,程序的主线程Main(比方java程序一开始启动时创建的那个线程)不会是守护线程.

 

      2.Daemon thread在Java里面的定义是,如果虚拟机中只有Daemon thread 在运行,则虚拟机退出。 虚拟机中可能会同时有很多个线程在运行,只有当所有的非守护线程都结束的时候,虚拟机的进程才会结束,不管在运行的线程是不是main()线程。

 

      3.Main主线程结束了(Non-daemon thread),如果此时正在运行的其他threads是daemon threads,JVM会使得这个threads停止,JVM也停下.如果此时正在运行的其他threads有Non-daemon threads,那么必须等所有的Non daemon线程结束了,JVM才会停下来.

 

       4.总之,必须等所有的Non-daemon线程都运行结束了,只剩下daemon的时候,JVM才会停下来,注意Main主程序是Non-daemon线程.

 

守护线程实例:

package cn.com.brilliance.atmv.udp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

import org.apache.log4j.Logger;

public class UDPServer extends UDPObject
{
    public static int MAX_RECEIVE = 1024;
    
    private static Logger logger = Logger.getLogger(UDPServer.class);
    
    private DatagramSocket ds = null;
    private boolean runFlag = false;
    private Thread t = null;
    private boolean isLogin = false;
    
    
    /**
     * default serve port
     */
    private int port = 10001;
    
    public UDPServer(int port)
    {
        super();
        this.port = port;
    }
    
    protected UDPServer()
    {
        super();
    }
    
    class ServerThread implements Runnable
    {

        DatagramSocket ds = null;
        UDPService service = null;
        
        ServerThread(DatagramSocket ds, UDPService service)
        {
            this.ds = ds;
            this.service = service;
        }
        
        public void run()
        {
            byte buffer[] = new byte[MAX_RECEIVE];
            DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
            logger.info("服务线程开始运行");
            for(;;)
            {
                try
                {
                    
                    ds.receive(dp);
                    if(dp.getLength() > 0)
                    {
                    	System.out.println("rece data len:" + dp.getLength());
                        String rev = new String(buffer, 0, dp.getLength());
                        System.out.println("rev is:" + rev);
                        String fromIP = dp.getAddress().getHostAddress();
                        logger.debug("收到报文["  +fromIP + ":" + dp.getPort() +  "]: " + rev);
                        if("#9999#".equals(rev))
                        {
                            logger.info("收到退出指令,线程退出运行");
                            break;
                        }
                        try
                        {
                            service.process(buffer, dp.getLength(), fromIP, dp.getPort());
                        }
                        catch(Exception e)
                        {
                            logger.error("process error:", e);
                        }
                    }
                }
                catch (Exception e)
                {
                    throw new RuntimeException("", e);
                }
            }
            buffer = null;
            dp = null;
        }
        
    }
    
    public void listen(UDPService service) throws UDPException
    {
        if(!runFlag)
        {
            try
            {
                ds = new DatagramSocket(port);
                t = new Thread(new ServerThread(ds, service));
                /*
                 * 程序从main方法进入,如果将t设置为守护线程   这无法执行
                 */
                //t.setDaemon(true);
                t.start();
                runFlag = true;
            }
            catch (Exception e)
            {
                throw new UDPException("创建UDP失败.", e);
            }            
        }
        else
        {
            //do nothing
        }
    }
}

 

 

分享到:
评论

相关推荐

    Java守护线程实例详解_动力节点Java学院整理

    Java守护线程实例详解 Java中的线程可以分为两类:User Thread(用户线程)和Daemon Thread(守护线程)。在Java中,Daemon Thread是一种特殊的线程,它的主要作用是为其他线程的运行提供便利服务。守护线程的特点...

    java daemon 守护线程实例

    java daemon 程序,有助于理解守护线程的概念和使用

    Java 守护线程,看这篇文章就对了! ( Daemon Thread )

    Java 的守护线程 Java 守护线程,看这篇文章就对了!Java 的守护线程什么是Java的守护线程( Daemon Thread )?守护线程的区别?守护线程的作用?守护线程如何创建?守护线程如何判断?守护线程使用的注意事项总结 ...

    Java 守护线程_动力节点Java学院整理

    Java 守护线程(Daemon Thread)是Java虚拟机(JVM)中的一种特殊线程类型,它们的主要目的是为其他用户线程(User Thread)提供服务。守护线程的典型应用包括垃圾收集器(GC)和其他后台任务,这些任务不直接影响...

    Java守护线程用法实例分析

    Java守护线程用法实例分析 Java守护线程是Java语言中的一种特殊类型的线程,它的生命周期与用户线程不同。当所有的用户线程都结束时,JVM会自动退出,而不会等待守护线程的结束。这是因为守护线程的主要作用是为...

    Java多线程的线程守护两个例子_.docx

    以下是一个简单的Java守护线程示例: ```java public class Test { public static void main(String[] args) { Thread t1 = new MyCommon(); // 非守护线程 Thread t2 = new Thread(new MyDaemon()); // 守护...

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

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

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

    浅谈java中守护线程与用户线程 本篇文章主要介绍了java中守护线程与用户线程的概念和区别。Java中的线程可以分为两类,即daemon线程(守护线程)和User线程(用户线程)。守护线程是一种特殊的线程,它们的生命周期...

    守护线程--源码--练手

    综上所述,这个压缩包中的"守护线程--源码--练手"项目提供了一个在Windows环境下实现非服务形式的守护线程示例,可以帮助开发者理解和实践Java守护线程的使用。通过阅读和分析源代码,我们可以学习到如何创建、设置...

    java多线程Demo

    守护线程是用于支持应用程序运行的后台线程,比如垃圾回收器就是守护线程。当所有非守护线程结束时,即使还有守护线程在运行,JVM也会退出。我们可以使用`setDaemon(true)`方法将线程设置为守护线程。 6. 线程...

    java多线程的讲解和实战

    5. **守护线程(Daemon)**:守护线程是一种不会阻止程序退出的特殊线程,例如JVM的垃圾收集器就是守护线程。通过`setDaemon(true)`方法将线程设置为守护线程。 6. **线程池**:Java提供`ExecutorService`和`...

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

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

    java的守护线程+log4日志记录

    很多人对java的线程不是很了解,甚至连守护线程都么有听过,其实很简单,守护线程就是普通的线程,区别再于,他就是类似一个秘书一样,记录着所有的非守护线程的信息等等,守护线程,是指为工作线程做相关统计、汇总...

    谈谈Java中的守护线程与普通线程

    Java中的线程分为两种类型:守护线程(Daemon)和用户线程(User)。这两类线程的主要区别在于它们对Java虚拟机(JVM)生命周期的影响。守护线程主要是为其他线程提供服务,比如垃圾回收线程,而用户线程则包含应用...

    Java多线程机制(讲述java里面与多线程有关的函数)

    守护线程(Daemon)是一种不阻止程序退出的线程,如垃圾收集器就是守护线程。当所有非守护线程结束时,程序会终止,即使还有守护线程在运行。 掌握Java的多线程机制对于编写高效、并发友好的应用程序至关重要,它...

    java 变形金刚中的守护神(守护线程)

    在Java编程语言中,守护线程(Daemon Thread)被称为“变形金刚中的守护神”,这是因为它们在后台默默地工作,为应用程序提供必要的服务,而不会阻止程序的退出。理解并正确使用守护线程是Java多线程编程中的一个...

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

    2. 守护线程与用户线程:守护线程不阻碍JVM退出,而用户线程则会阻止JVM退出。 八、中断与异常处理 1. Thread.interrupt():用于中断线程,但不一定立即停止,需要在run()方法内部检查中断标志并作出相应处理。 2. ...

    java 多线程示例

    守护线程不会阻止程序的退出,如JVM的垃圾收集器就是守护线程。可以通过`setDaemon(true)`将线程设置为守护线程。 9. **线程池** Java的`ExecutorService`和`ThreadPoolExecutor`类提供了一种更高效的方式来管理...

    线程 JAVA java线程 java线程第3版 java线程第2版第3版合集

    电子书相关:包含4个有关JAVA线程的电子书(几乎涵盖全部有关线程的书籍) OReilly.Java.Threads.3rd.Edition.Sep.2004.eBook-DDU Java Thread Programming (Sams) java线程第二版中英文 java线程第二版中英文 ...

    Java多线程详解及示例

    守护线程(Daemon Thread)是一种特殊线程,当所有非守护线程结束时,守护线程也会随之结束,通常用于后台服务。 总结: Java多线程编程是提升程序性能和响应性的关键技术。理解多线程的概念,掌握线程的创建、同步...

Global site tag (gtag.js) - Google Analytics