??xml version="1.0" encoding="utf-8" standalone="yes"?>高清视频欧美一级,情趣网站在线观看,免费一二一二在线视频http://www.aygfsteel.com/raymondchen625/category/7968.htmlJavaW记zh-cnWed, 28 Feb 2007 07:48:25 GMTWed, 28 Feb 2007 07:48:25 GMT60【{贴?Java的秘密:应用程序的讑֮存在哪里? http://www.aygfsteel.com/raymondchen625/articles/33869.htmlRaymond的JavaW记Raymond的JavaW记Mon, 06 Mar 2006 07:57:00 GMThttp://www.aygfsteel.com/raymondchen625/articles/33869.htmlhttp://www.aygfsteel.com/raymondchen625/comments/33869.htmlhttp://www.aygfsteel.com/raymondchen625/articles/33869.html#Feedback0http://www.aygfsteel.com/raymondchen625/comments/commentRss/33869.htmlhttp://www.aygfsteel.com/raymondchen625/services/trackbacks/33869.html

Java的秘密:应用程序的讑֮存在哪里?


http://www.chinaunix.net 作?eclipse  发表于:2002-09-03 15:48:04 ?A target=_blank>发表评论】?A target=_blank>查看原文】?A >Java讨论?/A>】?A href="javascript:window.close()">关闭?

Java的秘密:应用程序的讑֮存在哪里?

我们l常需要将我们的程序中的设定,如窗口位|,开启过的文Ӟ用户的选项讑֮{数据记录下来,以做便用户下一ơ开启程序能l箋使用q些数据?BR>以前我们通常的做法是使用Propertiesc,它提供以下方?
 void load(InputStream inStream)
 void store(OutputStream out, String header)
 String getProperty(String key, String defaultValue)
 String getProperty(String key)
q些Ҏ让我们很Ҏ的存取设定数?
另外的办法是使用ResourceBundleq个cL储存讑֮数据Q甚x些程序作者用一个自定结构的文g来储存设定数据?BR>但不怎样Q最让程序作者头痛的是:我该这些数据保存在哪?

现在好了QJDK1.4为我们提供的java.util.prefs包,里面有一个Preferencesc,能让以上的工作变得极其轻?
写VBE序的h常常用SaveSetting函数和getSettging来存取注册表中的用户讑֮数据。而Java的PreferencescM提供了类似的机制?BR>Preferencescd不同的^C有不同的实现方式。而在Windowsq_中,Preferences是将数据保存在注册表中的Q而在其它q_中的实现我就不得而知?我对Linux{系l都不太了解).
但不怎样Q都是通过相同的接口来使用的,E序作者可以不实现细节?BR>
建立Preferences对象
Z区分不同的应用程序的参数,在徏立Preferences时要指定一个节点\径?BR>Preferences是一个抽象类Q提供了一pd静态方法和抽象Ҏ来操作参数项:
抽象Ҏ:
 Preferences userData = Preferences.userNodeForPackage(this)&#59;
 Preferences sysData = Preferences.systemNodeForPackage(this)&#59;
 q两个方法是从指定的物g所在的?package)q回一个节点\径,如this是javax.swing.JComponent,则返?javax/swing
静态方?
 Preferences userData = Preferences.userRoot().node("/com/sunway/spc")&#59;
 Preferences sysData = Preferences.systemRoot().node("/com/sunway/spc")&#59;

 以上每种方式提供了两套操作方法。其中一套是用户参数,另一套是pȝ参数V?BR> 在Windowsq_中,用户参数在注册表中的根节点?BR> HKEY_CURRENT_USER\Software\JavaSoft\Prefs
 pȝ参数在注册表中的根节点?BR> HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs
而我们指定的节点路径是位于这些根节点之下?

如何d数据
Preferences提供了多U类型数据的dҎ?BR>先来看写(put)的方?
 put(String key, String value)
 putBoolean(String key, boolean value)
 putByteArray(String key, byte value[])
 putDouble(String key, double value)
 putFloat(String key, float value)
 putInt(String key, int value)
 putLong(String key, long value)
下面的是?get)的方?
 get(String key, String default)
 getBoolean(String key, boolean default)
 getByteArray(String key, byte default[])
 getDouble(String key, double default)
 getFloat(String key, float default)
 getInt(String key, int default)
 getLong(String key, long default)
 注意Q每一UgetҎ的第二个参数需要我们ؓ它指定缺省的参数?BR>除了以上方式之外QPreferencesq允许我们将它的数据导出C个XML文g保存Q?BR> void exportNode(OutputStream os)
 void exportSubtree(OutputStream os)
 我们可以导出一个节点,或是导出整个子节Ҏ.

Preferences的一个演C?BR>以上的讲解可以写一个示例来看看Preferences是如何ؓ我们工作?看看下面的例?
import java.io.*&#59;
import java.util.prefs.*&#59;

public class PrefsDemo {
  public static void main(String args[])
  {
    String keys[] =
      {"sunway","copyright","author"}&#59;
    String values[] =
      {"sunway technology company","copyright 2002","turbochen@163.com"}&#59;

    /* 建立一个位于user root下的/com/sunway/spc节点参数?/
    Preferences prefsdemo =
      Preferences.userRoot().node("/com/sunway/spc")&#59;

    /* 储存参数?/
    for (int i=0 &#59; i < keys.length&#59; i++)
    {
      prefsdemo.put(keys, values)&#59;
    }

    /* 导出到XML文g */
    try
    {
      FileOutputStream fos = new FileOutputStream(&quot;prefsdemo.xml&quot;)&#59;
      prefsdemo.exportNode(fos)&#59;
    } catch (Exception e)
    {
      System.err.println(&quot;Cannot export nodes: &quot; + e)&#59;
    }

    /* L注释可以清除注册表中的参数项*/
/*    try
      {
         prefsdemo.removeNode()&#59;
      } catch (BackingStoreException e)
      {
      } */

  }
}


Raymond的JavaW记 2006-03-06 15:57 发表评论
]]>
转脓Q?Java中ThreadLocal的设计与使用http://www.aygfsteel.com/raymondchen625/articles/32958.htmlRaymond的JavaW记Raymond的JavaW记Wed, 01 Mar 2006 01:09:00 GMThttp://www.aygfsteel.com/raymondchen625/articles/32958.htmlhttp://www.aygfsteel.com/raymondchen625/comments/32958.htmlhttp://www.aygfsteel.com/raymondchen625/articles/32958.html#Feedback0http://www.aygfsteel.com/raymondchen625/comments/commentRss/32958.htmlhttp://www.aygfsteel.com/raymondchen625/services/trackbacks/32958.html早在Java 1.2推出之时QJavaq_中就引入了一个新的支持:java.lang.ThreadLocalQ给我们在编写多U程E序时提供了一U新的选择。用这个工L可以很简z地~写Z的多线E程序,虽然ThreadLocal非常有用Q但是似乎现在了解它、用它的朋友还不多?

   ThreadLocal是什?/B>

   ThreadLocal是什么呢Q其实ThreadLocalq是一个线E的本地实现版本Q它q不是一个ThreadQ而是thread local variableQ线E局部变量)。也许把它命名ؓThreadLocalVar更加合适。线E局部变量(ThreadLocalQ其实的功用非常单,是为每一个用该变量的线E都提供一个变量值的副本Q是每一个线E都可以独立地改变自q副本Q而不会和其它U程的副本冲H。从U程的角度看Q就好像每一个线E都完全拥有该变量。线E局部变量ƈ不是Java的新发明Q在其它的一些语a~译器实玎ͼ如IBM XL FORTRANQ中Q它在语a的层ơ提供了直接的支持。因为Java中没有提供在语言层次的直接支持,而是提供了一个ThreadLocal的类来提供支持,所以,在Java中编写线E局部变量的代码相对比较W拙Q这也许是线E局部变量没有在Java中得到很好的普及的一个原因吧?BR>
   ThreadLocal的设?/B>

   首先看看ThreadLocal的接口:

    Object get() ; // q回当前U程的线E局部变量副?protected Object initialValue(); // q回该线E局部变量的当前U程的初始?BR>    void set(Object value); // 讄当前U程的线E局部变量副本的?BR>
   ThreadLocal?个方法,其中值得注意的是initialValue()Q该Ҏ是一个protected的方法,昄是ؓ了子c重写而特意实现的。该Ҏq回当前U程在该U程局部变量的初始|q个Ҏ是一个gq调用方法,在一个线E第1ơ调用get()或者set(Object)时才执行Qƈ且仅执行1ơ。ThreadLocal中的实实现直接q回一个nullQ?BR>
protected Object initialValue() { return null; }

  ThreadLocal是如何做Cؓ每一个线E维护变量的副本的呢Q其实实现的思\很简单,在ThreadLocalcM有一个MapQ用于存储每一个线E的变量的副本。比如下面的CZ实现Q?BR>
public class ThreadLocal
{
  private Map values = Collections.synchronizedMap(new HashMap());
  public Object get()
  {
   Thread curThread = Thread.currentThread();
   Object o = values.get(curThread);
   if (o == null && !values.containsKey(curThread))
   {
    o = initialValue();
    values.put(curThread, o);
   }
   return o;
  }

  public void set(Object newValue)
  {
   values.put(Thread.currentThread(), newValue);
  }

  public Object initialValue()
  {
   return null;
  }
}

  当然Q这q不是一个工业强度的实现Q但JDK中的ThreadLocal的实现M思\也类g此?BR>
   ThreadLocal的?/B>

   如果希望U程局部变量初始化其它|那么需要自己实现ThreadLocal的子cdƈ重写该方法,通常使用一个内部匿名类对ThreadLocalq行子类化,比如下面的例子,SerialNumcMؓ每一个类分配一个序P

public class SerialNum
{
  // The next serial number to be assigned

  private static int nextSerialNum = 0;
  private static ThreadLocal serialNum = new ThreadLocal()
  {
   protected synchronized Object initialValue()
   {
    return new Integer(nextSerialNum++);
   }
  };

  public static int get()
  {
   return ((Integer) (serialNum.get())).intValue();
  }
}

  SerialNumcȝ使用非常地单,因ؓget()Ҏ是static的,所以在需要获取当前线E的序号Ӟ单地调用Q?BR>
int serial = SerialNum.get();

  卛_?BR>
   在线E是zd的ƈ且ThreadLocal对象是可讉K的时Q该U程持有一个到该线E局部变量副本的隐含引用Q当该线E运行结束后Q该U程拥有的所以线E局部变量的副本都将失效Qƈ{待垃圾攉器收集?BR>
   ThreadLocal与其它同步机制的比较

   ThreadLocal和其它同步机制相比有什么优势呢QThreadLocal和其它所有的同步机制都是Z解决多线E中的对同一变量的访问冲H,在普通的同步机制中,是通过对象加锁来实现多个线E对同一变量的安全访问的。这时该变量是多个线E共享的Q用这U同步机刉要很l致地分析在什么时候对变量q行dQ什么时候需要锁定某个对象,什么时候释放该对象的锁{等很多。所有这些都是因为多个线E共享了资源造成的。ThreadLocal׃另一个角度来解决多线E的q发讉KQThreadLocal会ؓ每一个线E维护一个和该线E绑定的变量的副本,从而隔M多个U程的数据,每一个线E都拥有自己的变量副本,从而也没有必要对该变量进行同步了。ThreadLocal提供了线E安全的׃n对象Q在~写多线E代码时Q可以把不安全的整个变量装qThreadLocalQ或者把该对象的特定于线E的状态封装进ThreadLocal?BR>
   ׃ThreadLocal中可以持有Q何类型的对象Q所以用ThreadLocal get当前U程的值是需要进行强制类型{换。但随着新的Java版本Q?.5Q将模版的引入,新的支持模版参数的ThreadLocal<T>cd从中受益。也可以减少强制cd转换Qƈ一些错误检查提前到了编译期Q将一定程度地化ThreadLocal的用?BR>
   ȝ

   当然ThreadLocalq不能替代同步机Ӟ两者面向的问题领域不同。同步机制是Z同步多个U程对相同资源的q发讉KQ是Z多个U程之间q行通信的有效方式;而ThreadLocal是隔d个线E的数据׃nQ从Ҏ上就不在多个U程之间׃n资源Q变量)Q这样当然不需要对多个U程q行同步了。所以,如果你需要进行多个线E之间进行通信Q则使用同步机制Q如果需要隔d个线E之间的׃n冲突Q可以用ThreadLocalQ这极大地化你的程序,使程序更加易诅R简z?BR>
原文地址Q?http://www.pcbookcn.com/article/2364.htm

]]>
վ֩ģ壺 | ֲ| | | | | | | ͺ| | ױ| ¦| ;| | | ³| пǰ| | | | | ̩| | ƽ| | | | | | | ̨| | | Դ| ͭ| | żҸ| | | ײ| ذ|