/**
* 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;
}
}
分享到:
相关推荐
EXE版本,之前发的JDK9误写名称了。 Java 10 的 12 项关键新特性: JEP 286: 局部变量的类型推断。该特性在社区讨论了很久并做了调查,...“Feature releases” 版本将包含新特性,“Update releases” 版本仅修复 Bug
本项目将尽量严格按照MVP模式开发 其中会使用一些比较新的流行技术,当做学习 目前使用到的(used Library) 响应式编程:rxJava 数据库:realm,尽管有些坑,但还是在继续使用(线程问题实在麻烦,还是换回SQLite) ...
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); ...
本程序自V2.0版起采用全新的底层程序架构,使用了异步多线程编程技术,使得检测、 下载、修复单独进行,互不干扰,快速如飞。新程序更改了自我校验方式,因此使用新版本 的程序时不会再出现自我校验失败的错误;但...
登录过程完成后,iSCSI会话进入全功能相(full feature phase),这时启动设备就能通过iSCSI协议访问目标设备里的各逻辑单元了 响应/状态编号 从目标设备到启动设备的响应由iSCSI编号,在iSCSI协议数据单元中用...
* F5 :全部扫描(多线程同时扫描,每条记录等待5秒); 扫描过程中左下角状态栏会有提示,扫描完成后提示消失,扫描过程中建议不要新建、修改、删除、粘贴、剪切、排序记录,不然可能出现扫描结果错乱,其它功能可...
* F5 :全部扫描(多线程同时扫描,每条记录等待5秒); 扫描过程中左下角状态栏会有提示,扫描完成后提示消失,扫描过程中建议不要新建、修改、删除、粘贴、剪切、排序记录,不然可能出现扫描结果错乱,其它功能可...
文将对 Linux™ 程序员可以使用的内存管理技术进行概述,虽然关注的重点是 C 语言,但同样也适用于其他语言。文中将为您提供如何管理内存的细节,然后将进一步展示如何手工管理内存,如何使用引用计数或者内存池来半...
feature like the one in INTERNET EXPLORER 在浏览器中改变字体(4KB)<END><br>83,06.zip An ICMP Class For MFC 用MFC写的ICMP类(9KB)<END><br>84,07.zip Extending the IE Context Menu in your App ...
� 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...
31.zip Dragging a dialog by clicking anywhere on it 点击任何地方拖动对话框(11KB)<END><br>32,32.zip Splash screen with text on it that uses its own thread 通过自己的线程在Splash对话框中显示...