﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-真的有外星人吗？-随笔分类-多线程</title><link>http://www.blogjava.net/nokiaguy/category/38172.html</link><description>假如这个世界上只剩下你一个人，当你正坐在屋子里的时候，这时突然响起了敲门声，那么会是谁呢？</description><language>zh-cn</language><lastBuildDate>Fri, 24 Jul 2009 00:48:12 GMT</lastBuildDate><pubDate>Fri, 24 Jul 2009 00:48:12 GMT</pubDate><ttl>60</ttl><item><title>Java多线程初学者指南（12）：使用Synchronized块同步变量</title><link>http://www.blogjava.net/nokiaguy/archive/2009/03/22/261357.html</link><dc:creator>银河使者</dc:creator><author>银河使者</author><pubDate>Sun, 22 Mar 2009 13:26:00 GMT</pubDate><guid>http://www.blogjava.net/nokiaguy/archive/2009/03/22/261357.html</guid><wfw:comment>http://www.blogjava.net/nokiaguy/comments/261357.html</wfw:comment><comments>http://www.blogjava.net/nokiaguy/archive/2009/03/22/261357.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/nokiaguy/comments/commentRss/261357.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nokiaguy/services/trackbacks/261357.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 我们可以通过synchronized块来同步特定的静态或非静态方法。要想实现这种需求必须为这些特性的方法定义一个类变量，然后将这些方法的代码用synchronized块括起来，并将这个类变量作为参数传入synchronized块。在使用synchronized块时应注意，synchronized块只能使用对象作为它的参数。如果是简单类型的变量(如int、char、boolean等)，不能使用synchronized来同步。&nbsp;&nbsp;<a href='http://www.blogjava.net/nokiaguy/archive/2009/03/22/261357.html'>阅读全文</a><img src ="http://www.blogjava.net/nokiaguy/aggbug/261357.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nokiaguy/" target="_blank">银河使者</a> 2009-03-22 21:26 <a href="http://www.blogjava.net/nokiaguy/archive/2009/03/22/261357.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java多线程初学者指南（11）：使用Synchronized块同步方法</title><link>http://www.blogjava.net/nokiaguy/archive/2009/03/22/261354.html</link><dc:creator>银河使者</dc:creator><author>银河使者</author><pubDate>Sun, 22 Mar 2009 13:15:00 GMT</pubDate><guid>http://www.blogjava.net/nokiaguy/archive/2009/03/22/261354.html</guid><wfw:comment>http://www.blogjava.net/nokiaguy/comments/261354.html</wfw:comment><comments>http://www.blogjava.net/nokiaguy/archive/2009/03/22/261354.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nokiaguy/comments/commentRss/261354.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nokiaguy/services/trackbacks/261354.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: synchronized关键字有两种用法。第一种就是在《使用Synchronized关键字同步类方法》一文中所介绍的直接用在方法的定义中。另外一种就是synchronized块。我们不仅可以通过synchronized块来同步一个对象变量。也可以使用synchronized块来同步类中的静态方法和非静态方法。&nbsp;&nbsp;<a href='http://www.blogjava.net/nokiaguy/archive/2009/03/22/261354.html'>阅读全文</a><img src ="http://www.blogjava.net/nokiaguy/aggbug/261354.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nokiaguy/" target="_blank">银河使者</a> 2009-03-22 21:15 <a href="http://www.blogjava.net/nokiaguy/archive/2009/03/22/261354.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java多线程初学者指南（10）：使用Synchronized关键字同步类方法</title><link>http://www.blogjava.net/nokiaguy/archive/2009/03/20/261020.html</link><dc:creator>银河使者</dc:creator><author>银河使者</author><pubDate>Fri, 20 Mar 2009 05:05:00 GMT</pubDate><guid>http://www.blogjava.net/nokiaguy/archive/2009/03/20/261020.html</guid><wfw:comment>http://www.blogjava.net/nokiaguy/comments/261020.html</wfw:comment><comments>http://www.blogjava.net/nokiaguy/archive/2009/03/20/261020.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/nokiaguy/comments/commentRss/261020.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nokiaguy/services/trackbacks/261020.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 要想解决“脏数据”的问题，最简单的方法就是使用synchronized关键字来使run方法同步。虽然可以使用synchronized来定义方法，但synchronized并不属于方法定义的一部分，因此，synchronized关键字不能被继承。如果在父类中的某个方法使用了synchronized关键字，而在子类中覆盖了这个方法，在子类中的这个方法默认情况下并不是同步的，而必须显式地在子类的这个方法中加上synchronized关键字才可以。当然，还可以在子类方法中调用父类中相应的方法，这样虽然子类中的方法不是同步的，但子类调用了父类的同步方法，因此，子类的方法也就相当于同步了。&nbsp;&nbsp;<a href='http://www.blogjava.net/nokiaguy/archive/2009/03/20/261020.html'>阅读全文</a><img src ="http://www.blogjava.net/nokiaguy/aggbug/261020.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nokiaguy/" target="_blank">银河使者</a> 2009-03-20 13:05 <a href="http://www.blogjava.net/nokiaguy/archive/2009/03/20/261020.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java多线程初学者指南（9）：为什么要进行数据同步</title><link>http://www.blogjava.net/nokiaguy/archive/2009/03/19/260753.html</link><dc:creator>银河使者</dc:creator><author>银河使者</author><pubDate>Thu, 19 Mar 2009 05:23:00 GMT</pubDate><guid>http://www.blogjava.net/nokiaguy/archive/2009/03/19/260753.html</guid><wfw:comment>http://www.blogjava.net/nokiaguy/comments/260753.html</wfw:comment><comments>http://www.blogjava.net/nokiaguy/archive/2009/03/19/260753.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/nokiaguy/comments/commentRss/260753.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nokiaguy/services/trackbacks/260753.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Java中的变量分为两类：局部变量和类变量。局部变量是指在方法内定义的变量，如在run方法中定义的变量。对于这些变量来说，并不存在线程之间共享的问题。因此，它们不需要进行数据同步。类变量是在类中定义的变量，作用域是整个类。这类变量可以被多个线程共享。因此，我们需要对这类变量进行数据同步。数据同步就是指在同一时间，只能由一个线程来访问被同步的类变量，当前线程访问完这些变量后，其他线程才能继续访问。这里说的访问是指有写操作的访问，如果所有访问类变量的线程都是读操作，一般是不需要数据同步的。&nbsp;&nbsp;<a href='http://www.blogjava.net/nokiaguy/archive/2009/03/19/260753.html'>阅读全文</a><img src ="http://www.blogjava.net/nokiaguy/aggbug/260753.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nokiaguy/" target="_blank">银河使者</a> 2009-03-19 13:23 <a href="http://www.blogjava.net/nokiaguy/archive/2009/03/19/260753.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java多线程初学者指南（8）：从线程返回数据的两种方法</title><link>http://www.blogjava.net/nokiaguy/archive/2009/03/19/260745.html</link><dc:creator>银河使者</dc:creator><author>银河使者</author><pubDate>Thu, 19 Mar 2009 05:02:00 GMT</pubDate><guid>http://www.blogjava.net/nokiaguy/archive/2009/03/19/260745.html</guid><wfw:comment>http://www.blogjava.net/nokiaguy/comments/260745.html</wfw:comment><comments>http://www.blogjava.net/nokiaguy/archive/2009/03/19/260745.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nokiaguy/comments/commentRss/260745.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nokiaguy/services/trackbacks/260745.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 从线程中返回数据和向线程传递数据类似。也可以通过类成员以及回调函数来返回数据。但类成员在返回数据和传递数据时有一些区别，下面让我们来看看它们区别在哪。&nbsp;&nbsp;<a href='http://www.blogjava.net/nokiaguy/archive/2009/03/19/260745.html'>阅读全文</a><img src ="http://www.blogjava.net/nokiaguy/aggbug/260745.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nokiaguy/" target="_blank">银河使者</a> 2009-03-19 13:02 <a href="http://www.blogjava.net/nokiaguy/archive/2009/03/19/260745.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java多线程初学者指南（7）：向线程传递数据的三种方法</title><link>http://www.blogjava.net/nokiaguy/archive/2009/03/16/260131.html</link><dc:creator>银河使者</dc:creator><author>银河使者</author><pubDate>Mon, 16 Mar 2009 15:18:00 GMT</pubDate><guid>http://www.blogjava.net/nokiaguy/archive/2009/03/16/260131.html</guid><wfw:comment>http://www.blogjava.net/nokiaguy/comments/260131.html</wfw:comment><comments>http://www.blogjava.net/nokiaguy/archive/2009/03/16/260131.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/nokiaguy/comments/commentRss/260131.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nokiaguy/services/trackbacks/260131.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在传统的同步开发模式下，当我们调用一个函数时，通过这个函数的参数将数据传入，并通过这个函数的返回值来返回最终的计算结果。但在多线程的异步开发模式下，数据的传递和返回和同步开发模式有很大的区别。由于线程的运行和结束是不可预料的，因此，在传递和返回数据时就无法象函数一样通过函数参数和return语句来返回数据。本文就以上原因介绍了几种用于向线程传递数据的方法，在下一篇文章中将介绍从线程中返回数据的方法。&nbsp;&nbsp;<a href='http://www.blogjava.net/nokiaguy/archive/2009/03/16/260131.html'>阅读全文</a><img src ="http://www.blogjava.net/nokiaguy/aggbug/260131.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nokiaguy/" target="_blank">银河使者</a> 2009-03-16 23:18 <a href="http://www.blogjava.net/nokiaguy/archive/2009/03/16/260131.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java多线程初学者指南（6）：慎重使用volatile关键字</title><link>http://www.blogjava.net/nokiaguy/archive/2009/03/14/259733.html</link><dc:creator>银河使者</dc:creator><author>银河使者</author><pubDate>Sat, 14 Mar 2009 08:44:00 GMT</pubDate><guid>http://www.blogjava.net/nokiaguy/archive/2009/03/14/259733.html</guid><wfw:comment>http://www.blogjava.net/nokiaguy/comments/259733.html</wfw:comment><comments>http://www.blogjava.net/nokiaguy/archive/2009/03/14/259733.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.blogjava.net/nokiaguy/comments/commentRss/259733.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nokiaguy/services/trackbacks/259733.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: volatile关键字相信了解Java多线程的读者都很清楚它的作用。volatile关键字用于声明简单类型变量，如int、float、boolean等数据类型。如果这些简单数据类型声明为volatile，对它们的操作就会变成原子级别的。不过在使用volatile关键字时也要慎重，并不是只要简单类型变量使用volatile修饰，对这个变量的所有操作都是原来操作，当变量的值由自身的上一个决定时，如n=n+1、n++等，volatile关键字将失效，只有当变量的值和自身上一个值无关时对该变量的操作才是原子级别的，如n = m + 1，这个就是原级别的。所以在使用volatile关键时一定要谨慎，如果自己没有把握，可以使用synchronized来代替volatile。&nbsp;&nbsp;<a href='http://www.blogjava.net/nokiaguy/archive/2009/03/14/259733.html'>阅读全文</a><img src ="http://www.blogjava.net/nokiaguy/aggbug/259733.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nokiaguy/" target="_blank">银河使者</a> 2009-03-14 16:44 <a href="http://www.blogjava.net/nokiaguy/archive/2009/03/14/259733.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java多线程初学者指南（5）：join方法的使用</title><link>http://www.blogjava.net/nokiaguy/archive/2009/03/12/259262.html</link><dc:creator>银河使者</dc:creator><author>银河使者</author><pubDate>Thu, 12 Mar 2009 01:07:00 GMT</pubDate><guid>http://www.blogjava.net/nokiaguy/archive/2009/03/12/259262.html</guid><wfw:comment>http://www.blogjava.net/nokiaguy/comments/259262.html</wfw:comment><comments>http://www.blogjava.net/nokiaguy/archive/2009/03/12/259262.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.blogjava.net/nokiaguy/comments/commentRss/259262.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nokiaguy/services/trackbacks/259262.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在上面的例子中多次使用到了Thread类的join方法。我想大家可能已经猜出来join方法的功能是什么了。对，join方法的功能就是使异步执行的线程变成同步执行。也就是说，当调用线程实例的start方法后，这个方法会立即返回，如果在调用start方法后后需要使用一个由这个线程计算得到的值，就必须使用join方法。如果不使用join方法，就不能保证当执行到start方法后面的某条语句时，这个线程一定会执行完。而使用join方法后，直到这个线程退出，程序才会往下执行。&nbsp;&nbsp;<a href='http://www.blogjava.net/nokiaguy/archive/2009/03/12/259262.html'>阅读全文</a><img src ="http://www.blogjava.net/nokiaguy/aggbug/259262.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nokiaguy/" target="_blank">银河使者</a> 2009-03-12 09:07 <a href="http://www.blogjava.net/nokiaguy/archive/2009/03/12/259262.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java多线程初学者指南（4）：线程的生命周期</title><link>http://www.blogjava.net/nokiaguy/archive/2009/03/11/259060.html</link><dc:creator>银河使者</dc:creator><author>银河使者</author><pubDate>Wed, 11 Mar 2009 04:15:00 GMT</pubDate><guid>http://www.blogjava.net/nokiaguy/archive/2009/03/11/259060.html</guid><wfw:comment>http://www.blogjava.net/nokiaguy/comments/259060.html</wfw:comment><comments>http://www.blogjava.net/nokiaguy/archive/2009/03/11/259060.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/nokiaguy/comments/commentRss/259060.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nokiaguy/services/trackbacks/259060.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 与人有生老病死一样，线程也同样要经历开始（等待）、运行、挂起和停止四种不同的状态。这四种状态都可以通过Thread类中的方法进行控制。&nbsp;&nbsp;<a href='http://www.blogjava.net/nokiaguy/archive/2009/03/11/259060.html'>阅读全文</a><img src ="http://www.blogjava.net/nokiaguy/aggbug/259060.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nokiaguy/" target="_blank">银河使者</a> 2009-03-11 12:15 <a href="http://www.blogjava.net/nokiaguy/archive/2009/03/11/259060.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java多线程初学者指南（3）：使用Runnable接口创建线程</title><link>http://www.blogjava.net/nokiaguy/archive/2009/03/10/258765.html</link><dc:creator>银河使者</dc:creator><author>银河使者</author><pubDate>Tue, 10 Mar 2009 03:56:00 GMT</pubDate><guid>http://www.blogjava.net/nokiaguy/archive/2009/03/10/258765.html</guid><wfw:comment>http://www.blogjava.net/nokiaguy/comments/258765.html</wfw:comment><comments>http://www.blogjava.net/nokiaguy/archive/2009/03/10/258765.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nokiaguy/comments/commentRss/258765.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nokiaguy/services/trackbacks/258765.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 实现Runnable接口的类必须使用Thread类的实例才能创建线程。通过Runnable接口创建线程分为两步：1. 将实现Runnable接口的类实例化。2.   建立一个Thread对象，并将第一步实例化后的对象作为参数传入Thread类的构造方法。最后通过Thread类的start方法建立线程。&nbsp;&nbsp;<a href='http://www.blogjava.net/nokiaguy/archive/2009/03/10/258765.html'>阅读全文</a><img src ="http://www.blogjava.net/nokiaguy/aggbug/258765.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nokiaguy/" target="_blank">银河使者</a> 2009-03-10 11:56 <a href="http://www.blogjava.net/nokiaguy/archive/2009/03/10/258765.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java多线程初学者指南（2）：用Thread类创建线程</title><link>http://www.blogjava.net/nokiaguy/archive/2009/03/07/258361.html</link><dc:creator>银河使者</dc:creator><author>银河使者</author><pubDate>Sat, 07 Mar 2009 06:06:00 GMT</pubDate><guid>http://www.blogjava.net/nokiaguy/archive/2009/03/07/258361.html</guid><wfw:comment>http://www.blogjava.net/nokiaguy/comments/258361.html</wfw:comment><comments>http://www.blogjava.net/nokiaguy/archive/2009/03/07/258361.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/nokiaguy/comments/commentRss/258361.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nokiaguy/services/trackbacks/258361.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一个普通的Java类只要从Thread类继承，就可以成为一个线程类。并可通过Thread类的start方法来执行线程代码。虽然Thread类的子类可以直接实例化，但在子类中必须要覆盖Thread类的run方法才能真正运行线程的代码。&nbsp;&nbsp;<a href='http://www.blogjava.net/nokiaguy/archive/2009/03/07/258361.html'>阅读全文</a><img src ="http://www.blogjava.net/nokiaguy/aggbug/258361.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nokiaguy/" target="_blank">银河使者</a> 2009-03-07 14:06 <a href="http://www.blogjava.net/nokiaguy/archive/2009/03/07/258361.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java多线程初学者指南（1）：线程简介</title><link>http://www.blogjava.net/nokiaguy/archive/2009/03/07/258358.html</link><dc:creator>银河使者</dc:creator><author>银河使者</author><pubDate>Sat, 07 Mar 2009 05:43:00 GMT</pubDate><guid>http://www.blogjava.net/nokiaguy/archive/2009/03/07/258358.html</guid><wfw:comment>http://www.blogjava.net/nokiaguy/comments/258358.html</wfw:comment><comments>http://www.blogjava.net/nokiaguy/archive/2009/03/07/258358.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nokiaguy/comments/commentRss/258358.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nokiaguy/services/trackbacks/258358.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 线程是程序运行的基本执行单元。当操作系统(不包括单线程的操作系统，如微软早期的DOS)在执行一个程序时，会在系统中建立一个进程，而在这个进程中，必须至少建立一个线程（这个线程被称为主线程）来作为这个程序运行的入口点。因此，在操作系统中运行的任何程序都至少有一个主线程。&nbsp;&nbsp;<a href='http://www.blogjava.net/nokiaguy/archive/2009/03/07/258358.html'>阅读全文</a><img src ="http://www.blogjava.net/nokiaguy/aggbug/258358.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nokiaguy/" target="_blank">银河使者</a> 2009-03-07 13:43 <a href="http://www.blogjava.net/nokiaguy/archive/2009/03/07/258358.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>