OldJavaMan的专栏

Henry的技术世界

用户操作
[即时聊天] [发私信] [加为好友]
俞京华ID:oldjavaman
51154次访问,排名2304,好友0人,关注者2人。
java 技术和开源技术的爱好者
oldjavaman的文章
原创 38 篇
翻译 6 篇
转载 4 篇
评论 28 篇
oldjavaman的公告
Google


最近评论
Johncui:期待这个翻译计划的继续。
Johncui:期待这个翻译计划的继续。
blackcathl:我在suse机器下用headless模式启动,总是直接退出
因为公司的运营机器处于安全考虑,并没有完全安装xwindow和桌面,同时没有显示器等硬件,如果不加headless,soffice程序似乎在监听,可是并没有绑定socket的端口,只是在tmp下边有个OSL...的文件,我想请问这是怎么回事呢?谢谢执教
wangyx:很好,很强大!我google"java 加密狗",一不小心就跑到你这里来啦,好久不见啊,向大家问个好!原先那个手机丢了,所以大部分号码消失,联系不上了。。。QQ:401192126,Mail:wangxiaokuang@sina.com
视频资讯搜索-视搜网:看不懂
视频资讯搜索vsoso.cn
文章分类
收藏
相册
blog 专用插图
dvd图片
sun 2004 科技日
我的照片
常用链接
Collegesoft
dvd不完全手册
友情Blog(征集中)
dolphin的blog
存档
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

原创 Runnable VS Thread 收藏

新一篇: 有感于现在的IT培训 | 旧一篇: linux经典问题==网络篇【绝对转载】

    大家知道, 在我们写多线程的时候, 往往要Extends Thread来实现一个线程, 通过覆盖Run()来改写start()方法, 在很多情况下, 我们还有可能用implements Runnable来实现一个线程,他们有什么区别?

让我们来看一个例子:假设我们需要实现一个对象, 每个一段时间来检测一个服务器的端口是否还在活动,我们编写一个对象, 如下代码:

package com.collegesoft;

import java.net.URL;
import java.net.HttpURLConnection;
import java.io.*;
import java.net.*;

 

public class SendMsg extends Thread   {

    public final  static int SYSISOK=1;
    public final  static int SYSISDOWN=-1;
    public final  static int SYSISOUTOFTIME=0;
    public final  static int SYSISEXCEPTION=-3;

    String testURL;
    private URL url;

    boolean needStop=false;
    /**
     * 读取是否需要停止主线程
     * @return   停止标志符
     */
    public synchronized boolean  getNeedStop(){
        return needStop;

    }
    /**
     *  设置是否需要停止主线程 , 如果在外部调用 改线程的start()方法, 可以使用setNeedStop(true)来停止
     * @param b 停止标志符
     */
    public synchronized void  setNeedStop(boolean b){
        needStop=b;

    }

    /**
     *    构造器
     * @param testURL 要检测的URL
     */
    public   SendMsg(String testURL){
        this.testURL =testURL;

    }
    /**
     * 被检测系统的状态
     */
    private  int sysState=0;


    /**
     * 设置被检测系统的状态, 也可用于清零复位处理
     * @param state  即将设置的状态。
     */
    public synchronized void  setSysState(int state){
        System.out.println("set state ="+state);
        this.sysState =state;
    }


    /**
     * 返回被检测系统的当前状态
     * @return  被检测系统的当前状态 0:无响应, 1:正常, -1:当机 ,-3 :其他错误
     */
    public  synchronized int getSysState(){
        return  sysState;
    }

    public void run(){
        while (!needStop ){
            new TestURLThread(this).start() ;
            synchronized (this){
                try{
                    this.wait(30*1000);
                }catch(InterruptedException e) {

                }
                if (getSysState() == SYSISOK ) {
                    System.out.println("一切正常");
                }
                else if (getSysState() == SYSISDOWN ) {
                    System.out.println("系统荡机");
                }
                else if(getSysState()==SYSISOUTOFTIME ){
                    System.out.println("系统长时间无响应");
                }else{
                    System.out.println("系统发生其他错误");
                }

            }


        }


    }

   public static void main(String[] args) {
        new SendMsg("http://www.163.com").start();
    }

 

 


    /*************************************************************************
     * 内部类开始
     ************************************************************************/

    class  TestURLThread extends Thread{

        SendMsg sendSmg=null;
        TestURLThread(SendMsg send ){
            sendSmg =send;
        }

        /**
         * 作为Thread继承类 , 覆盖父类run方法
         */
        public void run(){

            //先复位
            setSysState(sendSmg.SYSISOUTOFTIME);
            HttpURLConnection httpCon = null;
            String results ;

            try {
                url = new URL(testURL);

                httpCon = (HttpURLConnection) url.openConnection();
                BufferedReader in = new BufferedReader(new InputStreamReader(httpCon.getInputStream()));
                results = in.readLine();
                httpCon.disconnect();
                setSysState(sendSmg.SYSISOK );
                /**
                 * 如果你不希望立即通知 sendSmg线程, 一下同步体可以去除!
                 */
                synchronized (sendSmg){
                    sendSmg.notify();
                    System.out.println("notify sendSMG");
                }

            }
            catch (ConnectException ex) {
                //如果建立连接异常,表示系统已断
                setSysState(sendSmg.SYSISDOWN );
                /**
                 * 如果你不希望立即通知 sendSmg线程, 一下同步体可以去除!
                 */
                synchronized (sendSmg){
                    sendSmg.notify();
                }
            }
            catch (Exception ex) {

                setSysState(sendSmg.SYSISEXCEPTION);
                /**
                 * 如果你不希望立即通知 sendSmg线程, 一下同步体可以去除!
                 */
                synchronized (sendSmg){
                    sendSmg.notify();
                }
            }

            finally {
                if (httpCon != null) {
                    httpCon.disconnect();
                    httpCon = null;
                }
            }


        }

    }

    /*************************************************************************
     * 内部类结束
     ************************************************************************/

}

我们在这个例子中, 用TestURLThread来测试163网站的80端口, 一旦有结果就notify() SendMsg线程的wait()方法, 不至于让他傻傻的等,现在的问题是, 我们是否可以将    TestURLThread不重Thread继承, 而是扩展Runnable接口来实现, 在SendMsg中用   

 new TestURLThread(this).run() ;来调用TestURLThread的run()方法?

答案是否定的

因为, 一旦替换成Runnable之后, 在TestURLThread的run里面, sendMSsg.notify()将不能及时唤醒SendMsg的wait(),只能靠 this.wait(30*1000);来退出等待。

这是我发现现象后得出的结论, 希望网友讨论, 是否有道理, 或者理由是什么

 

 

发表于 @ 2004年07月18日 23:10:00|评论(loading...)|编辑

新一篇: 有感于现在的IT培训 | 旧一篇: linux经典问题==网络篇【绝对转载】

评论

#oztime 发表于2004-07-19 08:36:00  IP: 211.100.224.*
让我想想
#snoopy 发表于2004-07-19 08:45:00  IP: 218.2.151.*
楼上是奥资时代的?
发表评论  


登录
Csdn Blog version 3.1a
Copyright © oldjavaman