<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>解惑 &#187; Thread</title>
	<atom:link href="http://www.jiehoo.me/tag/thread/feed" rel="self" type="application/rss+xml" />
	<link>http://www.jiehoo.me</link>
	<description>解己之惑，解人之惑</description>
	<lastBuildDate>Thu, 09 Sep 2010 03:25:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>MAPI32的Impersonate的问题</title>
		<link>http://www.jiehoo.me/impersonate-problem-of-mapi32.htm</link>
		<comments>http://www.jiehoo.me/impersonate-problem-of-mapi32.htm#comments</comments>
		<pubDate>Tue, 01 Sep 2009 09:59:24 +0000</pubDate>
		<dc:creator>Cherami</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[impersonate]]></category>
		<category><![CDATA[mapi32]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[Thread]]></category>
		<category><![CDATA[user]]></category>

		<guid isPermaLink="false">http://www.jiehoo.com/impersonate-problem-of-mapi32.htm</guid>
		<description><![CDATA[这个其实是 用代码创建MAPI的Profile的后续问题，因为我们把这个东西封装在Web Service里面供远程的其他程序调用，而这个Web Service的运行身份很重要，结合到底是谁？讲的，我们期望是可以通过Impersonate创建在我们指定的用户下面，但是MAPI32是根据当前的Process的用户身份，也就是Application pool的运行用户来读取注册表创建Profile的，所以Impersonate基本上没有用，有一些方法：http://blogs.msdn.com/stephen_griffin/archive/2005/04/13/407925.aspx ，但是基本上对我们不适用。]]></description>
			<content:encoded><![CDATA[<p class='fp'>这个其实是 <a href="../../create-mapi-profile-programmatically.htm" rel="bookmark" title="到 用代码创建MAPI的Profile 的永久链接">用代码创建MAPI的Profile</a>的后续问题，因为我们把这个东西封装在Web Service里面供远程的其他程序调用，而这个Web Service的运行身份很重要，结合<a href="../../which-user.htm" rel="bookmark" title="到 到底是谁？ 的永久链接">到底是谁？</a>讲的，我们期望是可以通过Impersonate创建在我们指定的用户下面，但是MAPI32是根据当前的Process的用户身份，也就是Application pool的运行用户来读取注册表创建Profile的，所以Impersonate基本上没有用，有一些方法：<span lang="EN-US" style="font-size: 11pt; color: rgb(31, 73, 125);"><a href="http://blogs.msdn.com/stephen_griffin/archive/2005/04/13/407925.aspx" title="blocked::http://blogs.msdn.com/stephen_griffin/archive/2005/04/13/407925.aspx">http://blogs.msdn.com/stephen_griffin/archive/2005/04/13/407925.aspx</a>  <o:p></o:p></span>，但是基本上对我们不适用。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jiehoo.me/impersonate-problem-of-mapi32.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>不要使用轮询</title>
		<link>http://www.jiehoo.me/do-not-use-polling.htm</link>
		<comments>http://www.jiehoo.me/do-not-use-polling.htm#comments</comments>
		<pubDate>Thu, 09 Nov 2006 09:43:52 +0000</pubDate>
		<dc:creator>Cherami</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[线程]]></category>
		<category><![CDATA[轮询]]></category>
		<category><![CDATA[通知]]></category>
		<category><![CDATA[Observer]]></category>
		<category><![CDATA[Thread]]></category>

		<guid isPermaLink="false">http://www.jiehoo.com/do-not-use-polling.htm</guid>
		<description><![CDATA[公司产品要集成LDAP，可以支持5个LDAP服务器，我们要写代码定期和LDAP服务器的信息进行同步，但是每个LDAP服务器的同步周期是变化的，用户可以配置。最简单的方式就是每个LDAP起一个线程做这个工作，但是架构师不允许太多的线程，所以要用一个主线程来控制。本来负责这个功能的人要使用轮询的方式，因为他觉得用户什么时候修改那个周期是不确定的，所以要一直查。其实很简单，如果其它的地方修改了那个周期，它通知那个主线程哪个服务器的周期修改了就行，然后主线程中断休眠并重新计算应该休眠的时间。主线程大部分时间都处于休眠状态，每次都会重新计算下一次应该休眠多长时间，这样程序的性能就大大的提高了。 演示代码如下： import java.util.ArrayList; import java.util.List; public class MainThread extends Thread { &#160;&#160;&#160; private List servers; &#160;&#160;&#160; private static MainThread instance; &#160;&#160;&#160; public static void updatePeriod(String serverName, long period) { &#160;&#160;&#160;&#160;&#160;&#160;&#160; for (int i = 0; i &#60; instance.servers.size(); i++) { &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Object[] server = (Object[]) instance.servers.get(i); &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (server[0].equals(serverName)) { &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; server[2] = new [...]]]></description>
			<content:encoded><![CDATA[<p class='fp'>公司产品要集成LDAP，可以支持5个LDAP服务器，我们要写代码定期和LDAP服务器的信息进行同步，但是每个LDAP服务器的同步周期是变化的，用户可以配置。最简单的方式就是每个LDAP起一个线程做这个工作，但是架构师不允许太多的线程，所以要用一个主线程来控制。本来负责这个功能的人要使用轮询的方式，因为他觉得用户什么时候修改那个周期是不确定的，所以要一直查。其实很简单，如果其它的地方修改了那个周期，它通知那个主线程哪个服务器的周期修改了就行，然后主线程中断休眠并重新计算应该休眠的时间。主线程大部分时间都处于休眠状态，每次都会重新计算下一次应该休眠多长时间，这样程序的性能就大大的提高了。</p>
<p>演示代码如下： <br />
<span id="more-91"></span> import java.util.ArrayList;<br />
import java.util.List;</p>
<p>public class MainThread extends Thread {<br />
&nbsp;&nbsp;&nbsp; private List servers;</p>
<p>&nbsp;&nbsp;&nbsp; private static MainThread instance;</p>
<p>&nbsp;&nbsp;&nbsp; public static void updatePeriod(String serverName, long period) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; instance.servers.size(); i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object[] server = (Object[]) instance.servers.get(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (server[0].equals(serverName)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; server[2] = new Long(period);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; instance.interrupt();</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public MainThread() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; instance = this;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; servers = new ArrayList();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object[] server1 = new Object[3];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; server1[0] = &quot;server1&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; server1[1] = new Long(System.currentTimeMillis());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; server1[2] = new Long(2000);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; servers.add(server1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object[] server2 = new Object[3];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; server2[0] = &quot;server2&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; server2[1] = new Long(System.currentTimeMillis());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; server2[2] = new Long(3000);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; servers.add(server2);<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public void run() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (true) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long current = System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long sleepTime = Long.MAX_VALUE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; servers.size(); i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object[] server = (Object[]) servers.get(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long last = ((Long) server[1]).longValue();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long period = ((Long) server[2]).longValue();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long next = last + period;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long sleep = next &#8211; current;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (sleepTime &gt; sleep) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sleepTime = sleep;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (sleep &lt;= 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;Synch thread started.&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; server[1] = new Long(current);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (sleepTime &gt; 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread.sleep(sleepTime);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (InterruptedException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;Interrupted.&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable t) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MainThread thread = new MainThread();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; thread.start();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; 10; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread.sleep(2000);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; updatePeriod(&quot;server1&quot;, 3000);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p>要强调一点的是，几乎所有的轮询都可以使用类似都方式解决，轮询做太多的无用功。另外一种好的方式就是使用Observer模式，和这个的性能类似。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jiehoo.me/do-not-use-polling.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
