<?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>runnable &#8211; Mahdi Tajik</title>
	<atom:link href="http://www.mahditajik.ir/tag/runnable/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.mahditajik.ir</link>
	<description>I&#039;m Mahdi Tajik. I am project manager and Full-stack Android developer. welcome to my personal website.</description>
	<lastBuildDate>Thu, 29 Nov 2018 14:18:09 +0000</lastBuildDate>
	<language>fa-IR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.2.6</generator>

<image>
	<url>http://www.mahditajik.ir/wp-content/uploads/2015/03/cropped-sample-logo-MT-2-32x32.png</url>
	<title>runnable &#8211; Mahdi Tajik</title>
	<link>http://www.mahditajik.ir</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>نحوه ارتباط بین thread ها</title>
		<link>http://www.mahditajik.ir/%d9%86%d8%ad%d9%88%d9%87-%d8%a7%d8%b1%d8%aa%d8%a8%d8%a7%d8%b7-%d8%a8%db%8c%d9%86-thread-%d9%87%d8%a7/</link>
					<comments>http://www.mahditajik.ir/%d9%86%d8%ad%d9%88%d9%87-%d8%a7%d8%b1%d8%aa%d8%a8%d8%a7%d8%b7-%d8%a8%db%8c%d9%86-thread-%d9%87%d8%a7/#comments</comments>
		
		<dc:creator><![CDATA[mahdi]]></dc:creator>
		<pubDate>Mon, 29 Jan 2018 10:51:58 +0000</pubDate>
				<category><![CDATA[آموزش]]></category>
		<category><![CDATA[Handler]]></category>
		<category><![CDATA[runnable]]></category>
		<category><![CDATA[Thread]]></category>
		<guid isPermaLink="false">http://www.mahditajik.ir/?p=2741</guid>

					<description><![CDATA[<p>thread یا رشته عبارتند از  واحد های کلی پردازش وظایف که هر برنامه می تواند تعدادی ترد داشته باشد. هر ترد اولویتی در سیستم دارد و تردهای ایجاد شده توسط یک ترد دیگر، اولویت هم سطح خواهند داشت. در اندروید هر برنامه یک ترد اصلی یا Main thread دارد و وقتی  thread جدیدی ایجاد می ...</p>
<p>نوشته <a rel="nofollow" href="http://www.mahditajik.ir/%d9%86%d8%ad%d9%88%d9%87-%d8%a7%d8%b1%d8%aa%d8%a8%d8%a7%d8%b7-%d8%a8%db%8c%d9%86-thread-%d9%87%d8%a7/">نحوه ارتباط بین thread ها</a> اولین بار در <a rel="nofollow" href="http://www.mahditajik.ir">Mahdi Tajik</a> پدیدار شد.</p>
]]></description>
										<content:encoded><![CDATA[<p><img decoding="async" loading="lazy" class="aligncenter size-full wp-image-2755" src="http://www.mahditajik.ir/wp-content/uploads/2018/01/thread.jpg" alt="" width="800" height="486" srcset="http://www.mahditajik.ir/wp-content/uploads/2018/01/thread.jpg 800w, http://www.mahditajik.ir/wp-content/uploads/2018/01/thread-300x182.jpg 300w, http://www.mahditajik.ir/wp-content/uploads/2018/01/thread-768x467.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></p>
<p style="text-align: justify;">thread یا رشته عبارتند از  واحد های کلی پردازش وظایف که هر برنامه می تواند تعدادی ترد داشته باشد. هر ترد اولویتی در سیستم دارد و تردهای ایجاد شده توسط یک ترد دیگر، اولویت هم سطح خواهند داشت. در اندروید هر برنامه یک ترد اصلی یا <strong>Main thread</strong> دارد و وقتی  <strong>thread</strong> جدیدی ایجاد می کنیم پردازش ها جدا از اتفاقات ترد اصلی روی می دهد. اما برای هماهنگ کردن و یا به عنوان مثال بازگشت جواب باید اینکار را بصورت دستی توسط <strong>message</strong> یا <strong>callback</strong> مدیریت کنیم.</p>
<p style="text-align: justify;">در این مقاله می خواهیم نحوه ارتباط با این دو روش را برسی کنیم.</p>
<p><strong>message</strong></p>
<p style="text-align: justify;">اصلی ترین راه ارتباط بین تردها پاس دادن پیام است. تردی که قرار است پیغام را دریافت کند باید دسترسی به صف پیغام ها داشته باشد که  messageQueue است و خود ترد ساده فاقد این کلاس است.</p>
<pre class="crayon-plain-tag">new Thread(new Runnable() {
    @Override
    public void run() {
        doSomething();
    }
}).start();</pre>
<p style="text-align: justify;">به شکل thread ساده و بدون messageQueue توجه کنید:</p>
<p><img decoding="async" loading="lazy" class="aligncenter size-full wp-image-2743" src="http://www.mahditajik.ir/wp-content/uploads/2018/01/Th_JAT.png" alt="" width="200" height="141" /></p>
<p style="text-align: justify;">برای افزودن messageQueue از کلاس Looper استفاده می کنیم که messageQueue را برایمان فراهم می کند.</p>
<pre class="crayon-plain-tag">new Thread(new Runnable() {
    @Override
    public void run() {
        Looper.prepare();
        doSomething();
        Looper.loop();
    }
}).start();</pre>
<p style="text-align: justify;">و بدین ترتیب messageQueue برایمان محیا می شود.</p>
<p style="text-align: justify;"><img decoding="async" loading="lazy" class="aligncenter size-full wp-image-2744" src="http://www.mahditajik.ir/wp-content/uploads/2018/01/Th_TWL.png" alt="" width="320" height="156" srcset="http://www.mahditajik.ir/wp-content/uploads/2018/01/Th_TWL.png 320w, http://www.mahditajik.ir/wp-content/uploads/2018/01/Th_TWL-300x146.png 300w" sizes="(max-width: 320px) 100vw, 320px" /></p>
<p style="text-align: justify;">حال تردی که می خواهد مسیج ارسال کند نیاز به یک <strong>Handler</strong> دارد. وظیفه Handler ارسال و پردازش پیغام مربوط به messageQueue ترد ساخته شده اش می باشد. ( همچنین اجرای Runnable که موضوع این آموزش نیست). وقتی یک Handler جدید می سازیم به threadhd ای که درون آن ساخته شده و messageQueue مربوطه متصل می شود و message ها و runnable ها را به messageQueue مربوطه می رساند و یا از روی آن اجرا می کند. در اینجا برای ارسال پیام کافیست که یک هندلر بصورتی تعریف کنیم هردو ترد دسترسی داشته باشند ( بصورت public یا پاس دادن بصورت properties) در یکی توسط آن Messagehvshg ارسال کنیم و در دیگری Message را گرفته و پردازش کنیم.</p>
<p><img decoding="async" loading="lazy" class="aligncenter size-full wp-image-2745" src="http://www.mahditajik.ir/wp-content/uploads/2018/01/Th_PAT.png" alt="" width="320" height="163" srcset="http://www.mahditajik.ir/wp-content/uploads/2018/01/Th_PAT.png 320w, http://www.mahditajik.ir/wp-content/uploads/2018/01/Th_PAT-300x153.png 300w" sizes="(max-width: 320px) 100vw, 320px" /></p>
<p style="text-align: justify;">به مثال ذیل توجه کنید:</p>
<pre class="crayon-plain-tag">private void testThreadMessaging() {

    Handler handler;

    new Thread(new Runnable() {
        @Override
        public void run() {
            Looper.prepare();

            handler = new Handler(){

                @Override
                public void handleMessage(Message msg) {
                    super.handleMessage(msg);
                    Toast.makeText(MainActivity.this, "Job finish with ( "+(float) msg.getData().getLong("jobTime")/1000+" ) seconds", Toast.LENGTH_SHORT)
                            .show();


                }
            };
            Looper.loop();
        }
    }).start();

    new Thread(new Runnable() {
        @Override
        public void run() {
            long jobTime = doSomething(ITERATION_COUNT);
            Message message = new Message();
            Bundle bundle = new Bundle();
            bundle.putLong("jobTime",jobTime);
            message.setData(bundle);
            handler.sendMessage(message);

        }
    }).start();
}</pre>
<pre class="crayon-plain-tag">private long doSomething(int iteration) {
    long startTime = System.currentTimeMillis();
    for (int i = 0; i &lt; iteration; i++) {
        Log.i("mahdi", "run: "+i);
    }
    long endTime = System.currentTimeMillis();

    return endTime - startTime ;
}</pre>
<p style="text-align: justify;">ترد اول بعد از تمام شدن کارش زمان انجام کار را به ترد دوم پاس می دهد. در اینجا handler بصورت public تعریف شده بود.</p>
<p><strong>Callback</strong></p>
<p style="text-align: justify;">در این روش ارتباط از طریق پاس دادن یک اینترفیس انجام می شود. برای اینکه مثال فرق کند ترد دریافت کننده پیام را در Ui thread قرار دادم. ( یعنی ترد جدیدی نساختم و در یک جایی در اکتیویتی تعریف کردم که می دانیم خود اکتیوتی در main thread یا همان Ui thread است).</p>
<pre class="crayon-plain-tag">private void testThreadCallBack(){

    //our receiver thread is main thread
    callBack = new ThreadCallBack() {
        @Override
        public void onMessage(Object o) {
            Log.i("mahdi", "Job finish with ( "+((Bundle) o).getLong("jobTime")/1000+" ) seconds");

        }
    };

    new Thread(new Runnable() {
        @Override
        public void run() {
            long jobTime = doSomething(ITERATION_COUNT);
            Bundle bundle = new Bundle();
            bundle.putLong("jobTime",jobTime);
            callBack.onMessage(bundle);
        }
    }).start();
}

interface ThreadCallBack{

    void onMessage(Object o);

}</pre>
<p style="text-align: justify;">برای درک بهتر کدها را اجرا کنید و نتایج را برسی کنید. در صورتی که سوال یا نکته ای داشتید کامنت کنید.</p>
<p>منبع: <a href="http://www.biitecode.ir" target="_blank" rel="noopener">بایت کد</a></p>
<p>نوشته <a rel="nofollow" href="http://www.mahditajik.ir/%d9%86%d8%ad%d9%88%d9%87-%d8%a7%d8%b1%d8%aa%d8%a8%d8%a7%d8%b7-%d8%a8%db%8c%d9%86-thread-%d9%87%d8%a7/">نحوه ارتباط بین thread ها</a> اولین بار در <a rel="nofollow" href="http://www.mahditajik.ir">Mahdi Tajik</a> پدیدار شد.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://www.mahditajik.ir/%d9%86%d8%ad%d9%88%d9%87-%d8%a7%d8%b1%d8%aa%d8%a8%d8%a7%d8%b7-%d8%a8%db%8c%d9%86-thread-%d9%87%d8%a7/feed/</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
			</item>
	</channel>
</rss>
