`
xubindehao
  • 浏览: 239526 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

线程 feature模式

阅读更多

/**
 * TODO guzhen 2011-1-25 Auto-generated class stub
 */

package com.taobao.dpservice.test;

/**
 * @author guzhen
 * @since 2011-1-25 下午02:12:04
 */
 public class Main { 
         public static void main(String[] args) { 
             System.out.println("main BEGIN"); 
             Host  host = new Host(); 
             Data data1 = host.request(10, 'A'); 
             Data data2 = host.request(20, 'B'); 
             Data data3 = host.request(30, 'C'); 
      
             System.out.println("main otherJob BEGIN"); 
             try { 
                 Thread.sleep(2000); 
             } catch (InterruptedException e) { 
             } 
             System.out.println("main otherJob END"); 
      
             System.out.println("data1 = " + data1.getContent()); 
             System.out.println("data2 = " + data2.getContent()); 
             System.out.println("data3 = " + data3.getContent()); 
             System.out.println("main END"); 
         } 
     } 



class Host {
   
    public Data request(final int count, final char c) {
        System.out.println("    request(" + count + ", " + c + ") BEGIN");
       
        // (1)建立FutureData的实例
        final FutureData future = new FutureData();
       
        // (2)为了建立RealData的实例,启用新的线程
        new Thread() {
           
            public void run() {
                RealData realdata = new RealData(count, c);
                future.setRealData(realdata);
            }
        }.start();
       
        System.out.println("    request(" + count + ", " + c + ") END");
       
        // (3)取回FutureData实例,作为返回值
        return future;
    }
}

interface Data {
    public abstract String getContent();
}

class FutureData implements Data {
   
    private RealData realdata = null;
    private boolean ready = false;
   
    public synchronized void setRealData(RealData realdata) {
        if (ready) {
            return; // balk
        }
        this.realdata = realdata;
        this.ready = true;
        notifyAll();
    }
   
    public synchronized String getContent() {
        while (!ready) {
            try {
                wait();
            } catch (InterruptedException e) {
            }
        }
        return realdata.getContent();
    }
}

class RealData implements Data {
   
    private final String content;
   
    public RealData(int count, char c) {
        System.out.println("        making RealData(" + count + ", " + c + ") BEGIN");
        char[] buffer = new char[count];
        for (int i = 0; i < count; i++) {
            buffer[i] = c;
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
            }
        }
        System.out.println("        making RealData(" + count + ", " + c + ") END");
        this.content = new String(buffer);
    }
   
    public String getContent() {
        return content;
    }
}

分享到:
评论

相关推荐

    JDK10官方包64位(Windows)

    EXE版本,之前发的JDK9误写名称了。 Java 10 的 12 项关键新特性: JEP 286: 局部变量的类型推断。该特性在社区讨论了很久并做了调查,...“Feature releases” 版本将包含新特性,“Update releases” 版本仅修复 Bug

    Android代码-SimpleGitHub

    本项目将尽量严格按照MVP模式开发 其中会使用一些比较新的流行技术,当做学习 目前使用到的(used Library) 响应式编程:rxJava 数据库:realm,尽管有些坑,但还是在继续使用(线程问题实在麻烦,还是换回SQLite) ...

    btjax蓝牙控制软件源码

    requestWindowFeature(Window.FEATURE_NO_TITLE);//设置显示模式无顶部 setContentView(R.layout.button); text_show=(TextView)findViewById(R.id.text_show); edit_0=(EditText)findViewById(R.id.edit_0); ...

    dx修复工具

    本程序自V2.0版起采用全新的底层程序架构,使用了异步多线程编程技术,使得检测、 下载、修复单独进行,互不干扰,快速如飞。新程序更改了自我校验方式,因此使用新版本 的程序时不会再出现自我校验失败的错误;但...

    iscsi协议及实现

    登录过程完成后,iSCSI会话进入全功能相(full feature phase),这时启动设备就能通过iSCSI协议访问目标设备里的各逻辑单元了 响应/状态编号 从目标设备到启动设备的响应由iSCSI编号,在iSCSI协议数据单元中用...

    Radmin自动登录器v3.0-多国语言绿色版-Release1-20150615

    * F5 :全部扫描(多线程同时扫描,每条记录等待5秒); 扫描过程中左下角状态栏会有提示,扫描完成后提示消失,扫描过程中建议不要新建、修改、删除、粘贴、剪切、排序记录,不然可能出现扫描结果错乱,其它功能可...

    Radmin自动登录器v3.0

    * F5 :全部扫描(多线程同时扫描,每条记录等待5秒); 扫描过程中左下角状态栏会有提示,扫描完成后提示消失,扫描过程中建议不要新建、修改、删除、粘贴、剪切、排序记录,不然可能出现扫描结果错乱,其它功能可...

    操作系统(内存管理)

    文将对 Linux™ 程序员可以使用的内存管理技术进行概述,虽然关注的重点是 C 语言,但同样也适用于其他语言。文中将为您提供如何管理内存的细节,然后将进一步展示如何手工管理内存,如何使用引用计数或者内存池来半...

    Visual C++ 编程资源大全(英文源码 网络)

    feature like the one in INTERNET EXPLORER 在浏览器中改变字体(4KB)&lt;END&gt;&lt;br&gt;83,06.zip An ICMP Class For MFC 用MFC写的ICMP类(9KB)&lt;END&gt;&lt;br&gt;84,07.zip Extending the IE Context Menu in your App ...

    新版Android开发教程.rar

    � WST (optional, but needed for the Android Editors feature; included in most Eclipse IDE packages ) o JDK 5 or JDK 6 (JRE alone is not sufficient) o Android Development Tools plugin (optional) o Not...

    Visual C++ 编程资源大全(英文源码 表单)

    31.zip Dragging a dialog by clicking anywhere on it 点击任何地方拖动对话框(11KB)&lt;END&gt;&lt;br&gt;32,32.zip Splash screen with text on it that uses its own thread 通过自己的线程在Splash对话框中显示...

Global site tag (gtag.js) - Google Analytics