`
MauerSu
  • 浏览: 513659 次
  • 性别: 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多线程编程核心技术_完整版_java_

    1. 继承Thread类:创建一个新的类,该类继承自Thread类,然后重写run()方法,最后创建该类的实例并调用start()方法启动线程。 2. 实现Runnable接口:创建一个实现Runnable接口的类,重写run()方法,然后将Runnable...

    java_Thread.rar_java 多线程_java多线程

    在Java中,通过实现Runnable接口或者继承Thread类可以创建并运行多线程。本资料"java_Thread.rar"提供了一些Java多线程的实践案例,对于深入理解和应用Java多线程技术具有很高的参考价值。 首先,我们要理解线程的...

    java线程.pdf

    Java线程有五种基本状态:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Terminated)。线程的状态会随着程序的运行而变化: 1. **新建**:当创建了一个新的线程对象后,该线程处于新建...

    java线程分析工具TDA

    TDA(Thread Dump Analyzer)是一款强大的Java线程分析工具,它能够帮助开发者深入理解应用在运行时的线程状态,包括线程的阻塞情况、等待资源、死锁等问题。下面将详细介绍TDA的使用方法、功能以及它如何帮助我们...

    JAVA专题技术综述之线程篇.rar_java 线程_java 线程

    Java线程有五种基本状态:新建(New)、可运行(Runnable)、运行(Running)、阻塞(Blocked)和终止(Terminated)。线程从新建到终止会经历这些状态,如通过调用`start()`方法进入可运行状态,而`sleep()`, `wait...

    clientThread.rar_java 多线程_java 聊天

    2. **线程的生命周期**:Java线程有新建、就绪、运行、阻塞和终止五个状态。理解这些状态对于管理线程至关重要,例如,使用`start()`方法启动线程,`sleep()`使线程暂停,`join()`让当前线程等待另一个线程完成,...

    Java线程.ppt

    学习Java线程,理解其创建、状态转换、调度和控制,以及如何处理线程间的互斥和同步,对于开发高效、稳定的并发程序至关重要。通过深入研究这些概念,开发者能够编写出更符合现代计算需求的高质量软件。

    java_type_train.rar_java 多线程_java 打字 程序_train_线程

    1. **线程状态**:Java线程有新建、可运行、运行、等待、阻塞和死亡等六种状态,理解这些状态及其转换对于调试和优化多线程程序至关重要。 2. **同步机制**:包括synchronized关键字、wait()、notify()和notifyAll()...

    java 线程池源代码

    Java线程池是一种高效管理线程的机制,它允许开发者预先创建一定数量的线程,然后根据需求将任务提交到线程池中进行执行。线程池的核心在于它能够有效地控制运行的线程数量,避免因为频繁创建和销毁线程而产生的性能...

    java 多线程.ppt,多线程

    Java线程有五种基本状态:新建(NEW)、可运行(RUNNABLE)、阻塞(BLOCKED)、等待(WAITING)和终止(TERMINATED)。线程从新建到终止会经历这些状态的转换。 4. 线程同步与互斥: 为了避免多线程环境下资源...

    java线程.rar

    Java线程是Java编程语言中...以上知识点覆盖了Java线程的基础概念、创建方式、状态管理、同步机制以及高级特性,是Java程序员必须掌握的重要内容。通过深入理解和熟练应用这些知识,可以编写出高效、安全的多线程程序。

    Java实现的两个线程同时运行案例

    在本文中,我们将使用Runnable接口来创建两个线程,并使其同时运行。我们将创建两个类,Pig和Bird,它们都实现了Runnable接口,并重写了run()方法。 Pig类中,我们使用while循环来实现线程的执行,并在每次循环中...

    JAVA多线程运用

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

    java多线程Demo

    Java线程有10个优先级(MIN_PRIORITY, NORM_PRIORITY, MAX_PRIORITY),默认优先级是NORM_PRIORITY。但是,线程优先级并不保证绝对的执行顺序,操作系统调度策略可能影响实际执行顺序。 7. join()方法: 一个线程...

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

    在Java编程中,线程是程序执行的基本单元,它允许应用程序同时执行多个任务。了解如何查看线程的运行状态对于调试和性能优化...通过阅读和分析源码,我们可以更深入地了解Java线程的工作原理,从而提升我们的编程技能。

    java-Thread-study-summary.zip_java 多线程

    Java线程有10个优先级,`MIN_PRIORITY`(1),`NORM_PRIORITY`(5)和`MAX_PRIORITY`(10)。较高的优先级并不意味着线程一定先执行,而是增加了获取CPU资源的概率。 5. **守护线程(Daemon)** 守护线程是支持...

    JAVA线程dump的分析

    JAVA线程dump的分析 JAVA线程dump是指在JAVA程序中,当前线程的状态和调用...本文中,我们讨论了如何生成和分析JAVA线程dump,包括了解线程状态、调用堆栈和Monitor的状态等,以及在实际运行中需要注意的一些问题。

    java线程深入解析

    当线程对象被创建并调用`start()`方法后,线程进入可运行态,由Java的线程调度器决定何时执行`run()`方法。 3. **线程状态** - **新线程态**: 线程对象被创建但未启动。 - **可运行态**: 调用`start()`方法后,...

    Java线程状态流转图

    该图形展示了Java线程从创建到终止的整个生命周期,并详细介绍了每种状态的特点和转换规则。 NEW(初始化状态) 在Java线程的生命周期中,NEW是最初始的状态。在这个状态下,线程对象已经创建,但尚未启动。只有...

Global site tag (gtag.js) - Google Analytics