读书人

线程 feature形式

发布时间: 2012-12-26 14:39:28 作者: rapoo

线程 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;
??? }
}

读书人网 >编程

热点推荐