`
MauerSu
  • 浏览: 495001 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

04.如何创建并运行java线程

 
阅读更多
源:http://ifeve.com/creating-and-starting-java-threads/
评:
原文链接  译者:章筱虎  校对:方腾飞

Java线程类也是一个object类,它的实例都继承自java.lang.Thread或其子类。 可以用如下方式用java中创建一个线程:

查看源代码打印帮助
1 Tread thread = new Thread();
执行该线程可以调用该线程的start()方法:

查看源代码打印帮助
1 thread.start();

在上面的例子中,我们并没有为线程编写运行代码,因此调用该方法后线程就终止了。

编写线程运行时执行的代码有两种方式:一种是创建Thread子类的一个实例并重写run方法,第二种是创建类的时候实现Runnable接口。接下来我们会具体讲解这两种方法:

创建Thread的子类

创建Thread子类的一个实例并重写run方法,run方法会在调用start()方法之后被执行。例子如下:

查看源代码打印帮助
1 public class MyThread extends Thread { 

2    public void run(){ 

3      System.out.println("MyThread running"); 

4    } 

5 }
可以用如下方式创建并运行上述Thread子类

查看源代码打印帮助
1 MyThread myThread = new MyThread(); 

2 myTread.start();
一旦线程启动后start方法就会立即返回,而不会等待到run方法执行完毕才返回。就好像run方法是在另外一个cpu上执行一样。当run方法执行后,将会打印出字符串MyThread running。

你也可以如下创建一个Thread的匿名子类:

查看源代码打印帮助
1 Thread thread = new Thread(){ 

2    public void run(){ 

3      System.out.println("Thread Running"); 

4    } 

5 }; 

6 thread.start();
当新的线程的run方法执行以后,计算机将会打印出字符串”Thread Running”。

实现Runnable接口

         第二种编写线程执行代码的方式是新建一个实现了java.lang.Runnable接口的类的实例,实例中的方法可以被线程调用。下面给出例子:

查看源代码打印帮助
1 public class MyRunnable implements Runnable { 

2    public void run(){ 

3     System.out.println("MyRunnable running"); 

4    } 

5 }
为了使线程能够执行run()方法,需要在Thread类的构造函数中传入 MyRunnable的实例对象。示例如下:

查看源代码打印帮助
1 Thread thread = new Thread(new MyRunnable()); 

2 thread.start();
         当线程运行时,它将会调用实现了Runnable接口的run方法。上例中将会打印出”MyRunnable running”。

同样,也可以创建一个实现了Runnable接口的匿名类,如下所示:

查看源代码打印帮助
1 Runnable myRunnable = new Runnable(){ 

2    public void run(){ 

3      System.out.println("Runnable running"); 

4    } 

5 } 

6 Thread thread = new Thread(myRunnable); 

7 thread.start();
创建子类还是实现Runnable接口?

对于这两种方式哪种好并没有一个确定的答案,它们都能满足要求。就我个人意见,我更倾向于实现Runnable接口这种方法。因为线程池可以有效的管理实现了Runnable接口的线程,如果线程池满了,新的线程就会排队等候执行,直到线程池空闲出来为止。而如果线程是通过实现Thread子类实现的,这将会复杂一些。

有时我们要同时融合实现Runnable接口和Thread子类两种方式。例如,实现了Thread子类的实例可以执行多个实现了Runnable接口的线程。一个典型的应用就是线程池。

常见错误:调用run()方法而非start()方法

创建并运行一个线程所犯的常见错误是调用线程的run()方法而非start()方法,如下所示:

查看源代码打印帮助
1 Thread newThread = new Thread(MyRunnable()); 

2 newThread.run();  //should be start();
起初你并不会感觉到有什么不妥,因为run()方法的确如你所愿的被调用了。但是,事实上,run()方法并非是由刚创建的新线程所执行的,而是被创建新线程的当前线程所执行了。也就是被执行上面两行代码的线程所执行的。想要让创建的新线程执行run()方法,必须调用新线程的start方法。

线程名

当创建一个线程的时候,可以给线程起一个名字。它有助于我们区分不同的线程。例如:如果有多个线程写入System.out,我们就能够通过线程名容易的找出是哪个线程正在输出。例子如下:

查看源代码打印帮助
1 MyRunnable runnable = new MyRunnable(); 

2 Thread thread = new Thread(runnable, "New Thread"); 

3 thread.start(); 

4 System.out.println(thread.getName());
需要注意的是,因为MyRunnable并非Thread的子类,所以MyRunnable类并没有getName()方法。可以通过以下方式得到当前线程的引用:

查看源代码打印帮助
1 Thread.currentThread();
因此,通过如下代码可以得到当前线程的名字:

查看源代码打印帮助
1 String threadName = Thread.currentThread().getName();
线程代码举例:
这里是一个小小的例子。首先输出执行main()方法线程名字。这个线程JVM分配的。然后开启10个线程,命名为1~10。每个线程输出自己的名字后就退出。

查看源代码打印帮助
01 public class ThreadExample { 

02   public static void main(String[] args){ 

03      System.out.println(Thread.currentThread().getName()); 

04       for(int i=0; i<10; i++){ 

05          new Thread("" + i){ 

06             public void run(){ 

07              System.out.println("Thread: " + getName() + "running"); 

08             } 

09          }.start(); 

10       } 

11   } 

12 }
需要注意的是,尽管启动线程的顺序是有序的,但是执行的顺序并非是有序的。也就是说,1号线程并不一定是第一个将自己名字输出到控制台的线程。这是因为线程是并行执行而非顺序的。Jvm和操作系统一起决定了线程的执行顺序,他和线程的启动顺序并非一定是一致的。

(全文完)


--------------------------------------------------------------------------------

原创文章转载请注明出处:如何创建并运行java线程
支持本站::Pay For Your Wish
分享到:
评论

相关推荐

    JAVA多线程运用

    (2)、创建TestCounter类,在该类中定义main函数,在main函数中定义Storage对象、Counter对象和 Printer对象,创建Counter线程和Printer线程并启动 (3)、保存文件,调试并编译运行程序。 参考程序运行效果: 3. ...

    如何创建并运行java线程

    Java线程类也是一个object类,它的实例都继承自java.lang.Thread或其子类。 可以用如下方式用java中创建一个线程:  Tread thread = new Thread();  执行该线程可以调用该线程的start()方法:  thread.start();...

    java多线程编程 在主线程main中创建两个子线程

    自己学着编写的一个JAVA多线程程序,该程序实现的功能是:在主线程main中创建两个子线程,A和B,线程A先运行,再运行B线程,当两个子线程都运行完毕后,才运行主线程,并最终结束整个程序的运行。 希望该程序对初学...

    推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 04.流程控制和数组(共33页).ppt

    推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 04.流程控制和数组(共33页).ppt 推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 05.面向对象(上)(共35页).ppt 推荐优质Java课程 疯狂Java语言...

    推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 16.多线程(共44页).ppt

    推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 04.流程控制和数组(共33页).ppt 推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 05.面向对象(上)(共35页).ppt 推荐优质Java课程 疯狂Java语言...

    java 线程 dump 分析工具 2.3.3

    java 线程Dump 分析工具: Java的TDA线程转储分析器是一个用于分析Sun Java VM...它可以在线程之间进行区分,以寻找相似之处,并具有“长运行线程”检测。如果记录了类的直方图,它还提供了线程转储中的堆对象的概述。

    Java源码查看线程的运行状态.rar

    Java源码查看线程的运行状态.rarJava源码Java程序设计经典300例

    推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 07.与运行环境交互(共40页).ppt

    推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 04.流程控制和数组(共33页).ppt 推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 05.面向对象(上)(共35页).ppt 推荐优质Java课程 疯狂Java语言...

    Java线程详解.ppt

    如果一个程序中要实现两段程序代码同时交替运行,就需要产生多个线程,并指定每个线程上所要运行的程序代码段,这就是多线程。 程序启动运行时,就自动产生了一个线程,main方法就是在这个线程上运行的,当不再产生...

    java线程分析工具.zip

    java线程分析工具(工具+使用说明) 1、生成堆栈报告1.txt ...在windows中双击运行:java线程堆栈分析工具-jca463.jar 3、拖入报告 导出1.txt到windows中,将1.txt拖入工具界面中的表格“Thread Dump List”

    JAVA技巧(Java多线程运行时,减少内存占用量).pdf

    JAVA技巧(Java多线程运行时,减少内存占用量).pdf

    java核心知识点整理.pdf

    堆(Heap-线程共享)-运行时数据区 ...................................................................................... 23 2.2.5. 方法区/永久代(线程共享) ..................................................

    spring和quartz的集成(java线程的方式运行)

    这个是spring 和 quartz的集成,quartz是单独的包,java线程的方式运行,利用自定义Jobfactory来解决spring注入service空指针的问题,简单实例执行main方法即可,很实用

    推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 01.Java语言概述(共21页).ppt

    推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 04.流程控制和数组(共33页).ppt 推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 05.面向对象(上)(共35页).ppt 推荐优质Java课程 疯狂Java语言...

    Java多线程示例 可以直接运行

    这个是Java多线程示例,可以直接运行,希望对需要的人有所帮助!

    Java多线程编程经验

    比如java.exe进程中可以运行很多线程。线程总是属于某个进程,进程中的多个线程共享进程的内存。 “同时”执行是人的感觉,在线程之间实际上轮换执行。 本文档提供Java多线程编程经验,方便广大Java爱好者研究学习...

    java多线程使用

    主要内容 线程的概念 线程的生命周期 Java中多线程的编程 继承Thread类与使用Runnable接口 Thread类的主要方法 线程的同步与死锁 动画

    java多线程下载

    1.得到服务器下载文件的大小,然后在本地设置一个临时文件和服务器端文件大小一致 a)获得访问网络地址 b)通过URL对象的openConnection()方法打开连接,返回一个连接...b)当没有正在运行的线程时切文件存在时删除文件

    java多线程学习必备_快速理解java多线程(附代码和运行结果截图和解释文档)

    java多线程学习必备_快速理解java多线程(附代码、运行结果截图、解释文档)

    java线程文档

     Java编写程序都运行在在Java虚拟机(JVM)中,在JVM的内部,程序的多任务是通过线程来实现的。每用java命令启动一个java应用程序,就会启动一个JVM进程。在同一个JVM进程中,有且只有一个进程,就是它自己。在这个...

Global site tag (gtag.js) - Google Analytics