免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2639 | 回复: 4
打印 上一主题 下一主题

问一个关于socket和线程等待接受消息的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-09-05 15:47 |只看该作者 |倒序浏览
在线程里面等待接受消息,除了while(true)以外,还有没有其他的方法了呢?
总觉着这种方法比较消耗资源。望各位大虾指点~~~

论坛徽章:
0
2 [报告]
发表于 2005-09-06 09:59 |只看该作者

问一个关于socket和线程等待接受消息的问题

因为java的线程停止方法不推荐用stop,所以任何时候都不应该出现while(true)这样的线程,这些你可以看看http://www.zdnet.com.cn/developer/code/story/0,2000081534,39214940,00.htm
这个,另外可以定义一个Object signal,保证两个线程用的是同一个signal对象,在监听的线程中用signal.wait().在发送消息的那个线程在发送完消息后,调用signal.notify() (或者notifyall)唤醒监听线程,让其知道有消息到来,读取。

论坛徽章:
0
3 [报告]
发表于 2005-09-06 10:13 |只看该作者

问一个关于socket和线程等待接受消息的问题

收到,我去研究一下~~~

论坛徽章:
0
4 [报告]
发表于 2005-09-06 14:46 |只看该作者

问一个关于socket和线程等待接受消息的问题

能给你所说的用wait()和notify()的例子吗?
最好带源代码的~~~
这里先谢谢了~~~

论坛徽章:
0
5 [报告]
发表于 2005-09-06 16:02 |只看该作者

问一个关于socket和线程等待接受消息的问题

更正一点,直接用Object类的notify,wait会抛异常。用UserSignal包装了一下:下面是源码:

UserSignal:

package example.cu.transfer;

public class UserSignal
{
    /**
     *
     * @throws InterruptedException
     */
    public synchronized void waitForNotify() throws InterruptedException
    {
        super.wait();
    }

    public synchronized void notifyTheWait()
    {
        super.notifyAll();
    }
}

IMsgTransfer:


package example.cu.transfer;

public interface IMsgTransfer
{   
    public void addMsg2Queue(String msg);
   
    public String getMsgFromQueue() throws InterruptedException;
}

MsgTransfer:

package example.cu.transfer;

import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;


public class MsgTransfer implements IMsgTransfer
{
    private static Queue<String>; msgQueue = null;

    private static UserSignal signal = null;

    public MsgTransfer()
    {
        msgQueue = new ConcurrentLinkedQueue<String>;();
        signal = new UserSignal();
    }

   
    public void addMsg2Queue(String msg)
    {
        if (msg != null)
        {
            if (msgQueue.size() >;= 30)
            {
                msgQueue.remove();
            }
            msgQueue.add(msg);
            signal.notifyTheWait();
        }
    }

   
    public String getMsgFromQueue() throws InterruptedException
    {
        String msg = null;
        if (msgQueue.isEmpty())
            signal.waitForNotify();
        msg = msgQueue.poll();
        return msg;
    }
}

TransferFactory:
package example.cu.transfer;

public class TransferFactory
{
    private static IMsgTransfer msgTransfer = null;
   
    public static IMsgTransfer getMsgTransfer()
    {
        if(msgTransfer == null)
        {
            msgTransfer = new MsgTransfer();
        }
        return msgTransfer;
    }
}


Msgproducter:

package example.cu.transfer;


public class MsgProducter
{
    private IMsgTransfer msgTransfer;
   
    public MsgProducter()
    {
        this.msgTransfer = TransferFactory.getMsgTransfer();
    }
   
    public void addMsg(String msg)
    {
        this.msgTransfer.addMsg2Queue(msg);
    }
}



MsgConsumer:

package example.cu.transfer;

public class MsgConsumer
{
    private IMsgTransfer msgTransfer;

    private GetMsgThread msgThread;

    public MsgConsumer()
    {
        this.msgThread = new GetMsgThread();
        this.msgTransfer = TransferFactory.getMsgTransfer();
    }

    public void startThread()
    {
        this.msgThread.start();
    }

    public void stopThread()
    {
        this.msgThread.stop = true;
        this.msgThread.interrupt();
    }

    class GetMsgThread extends Thread
    {
        volatile boolean stop = false;

        public void run()
        {
            while (!stop)
            {
                try
                {
                    String msg = msgTransfer.getMsgFromQueue();
                    System.out.println("In thread msg = " + msg);
                }
                catch (InterruptedException e)
                {
                    stop = true;
                }
            }
        }
    }

}

TestMain:


package example.cu.transfer;


public class TestMain
{
    public static void main(String[] args)
    {
        MsgConsumer consumer = new MsgConsumer();
        MsgProducter producter = new MsgProducter();
        
        consumer.startThread();
        for(int i = 0; i< 10;i++)
        {
            producter.addMsg("add " + i + " msg";
            try
            {
                Thread.sleep(1000);
            }
            catch (InterruptedException e)
            {               
                e.printStackTrace();
            }
        }
        consumer.stopThread();
    }
}

用Transfer模拟一个转发器,MsgProducter在获得数据后放在Transfer的队列中,MsgConsumer消费放在队列中的数据,队列中无数据时阻塞。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP