当前位置:首页 > 开发 > 编程语言 > 多线程 > 正文

java 守护线程

发表于: 2014-10-29   作者:嵇海波   来源:转载   浏览:
摘要: java守护线程的定义:      1.所谓守护线程就是运行在程序后台的线程,程序的主线程Main(比方java程序一开始启动时创建的那个线程)不会是守护线程.         2.Daemon thread在Java里面的定义是,如果虚拟机中只有Daemon thread 在运行,则虚拟机退出。 虚拟机中可能会

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 守护线程

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
前言: 在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程) 只要当前JVM实例中尚
前言: 在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程) 只要当前JVM实例中尚
在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程) 用个比较通俗的比如,任何一
在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程) 用个比较通俗的比如,任何一
守护线程 学习的过程中偶然发现Java中居然也有守护线程这东西,感觉十分好奇,网上查阅一些资料做一
什么是守护线程 a. 在客户/服务器模式下,服务器的作用是等待用户发来请求,并按请求完成客户的工作
什么是守护线程 a. 在客户/服务器模式下,服务器的作用是等待用户发来请求,并按请求完成客户的工作
1、守护线程 Java线程机制分为两种 ,用户线程(User Thread)和守护线程(Daemon Thread)。 用户
在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程) Daemon的作用是为其他线程的
所谓的后台线程,是指在程序运行的时候在后台提供一种通用服务的线程,并且这种线程并不属于程序中
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号