- 浏览: 291257 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
wahahachuang5:
web实时推送技术使用越来越广泛,但是自己开发又太麻烦了,我觉 ...
java以post发送方式实现百度Sitemap实时推送代码分享 -
fmpoffice:
发来感谢!准备尝试!https://m.yooshifu.co ...
java以post发送方式实现百度Sitemap实时推送代码分享 -
playboyhaolei:
爱死博主了 学习了 已经成功的推送了 ...
java以post发送方式实现百度Sitemap实时推送代码分享 -
playboyhaolei:
爱死博主了 学习了 已经成功的推送了 ...
java以post发送方式实现百度Sitemap实时推送代码分享 -
真三武侯:
爱死博主了
java以post发送方式实现百度Sitemap实时推送代码分享
要产生一个线程,有两种方法:
◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法;
◆实现Runnable接口,重载Runnable接口中的run()方法。
具体步骤
1、扩展Thread类来创建线程
首先,需要通过创建一个新类来扩展Thread类,这个新类就成为Thread类的子类。接着在该子类中重写Thread类的run()方法,此时方法体内的程序就是将来要在新建线程中执行的代码。
示例如下所示:
class SubThread extends Thread |
接着要创建该子类的对象,此时一个新的线程就被创建了,创建新线程时会用到Thread 类定义的如下两个构造函数:
◆public Thread()
◆public Thread(String name)
其中,第一个构造函数是Thread类默认的构造函数,不指定参数;第二个构造函数可以为新建的线程指定一个名称,该名称就是字符串参数name的值。
建立了新的线程对象以后,它并不运行,而是直到调用了该对象的start()方法,该方法在Thread 类中定义,在Thread 类的子类中被覆盖。它的作用是启动一个新的线程,并在该线程上运行子类对象中的run()方法。
start()方法声明格式为:
public void start() |
示例如下所示:
SubThread s = new SubThread(); // 创建Thread子类的对象 |
当一个类继承Thread类时,它必须重写run()方法,这个方法是新线程的入口。如 果Thread类的这个子类没有覆盖run()方法,那么程序会调用Thread类的run()方法,只 不过该run()方法什么也不做,此时新线程一创建就结束了。这种线程对程序来说是没有 任何意义的,所以在这里提醒读者在创建线程的时候一定不要忘了覆盖Thread类的run()方法。
下面举一个完整的例子来演示通过扩展Thread类创建线程的过程。程序代码如下所示:
// 例4.1.1 ThreadDemo.java |
可以看到,新的线程是由实例化NewThread类的对象创建的,该NewThread类可以通过继承java.lang.Thread类来得到。其中,在NewThread类中,构造函数里调用了super()方法。该方法将调用父类Thread下列形式的构造函数:
public Thread(String threadName) |
这里,threadName指定线程名称(当然也可以不指定线程的名称,而由系统自动为新建线程提供名称)。在NewThread类中通过覆写 run()方法来规定线程所要实现的内容。此外,需要注意的是,启动新线程执行时必须调用start()方法。程序结果如图4.1.1所示:
在上面的代码中,使用了Thread类的currentThread()静态方法来获得当前程序执行时所对应的那个线程对象,又通过线程对象的 getName()方法,得到了当前线程的名字。这些方法都可以在JDK帮助文档中查到。因此,善于利用JDK帮助文档来获取有关类的更多信息,可以方便 程序的编写。
在上面代码的run()方法中,由于循环条件始终为true,因此,屏幕上会不断地输出Thread Demo is running,新建的线程永远不会结束,这当然不是所希望的结果。这里所希望的是可以合理的设置循环条件来有效地控制线程的终止。所以,在run()方 法中使用到循环控制的时候一定要小心使用,否则局面难以控制。
其实,针对前面的程序做一些改动。可以让这个程序实现一个非常有用的功能。
// 例4.1.2 ThreadDemo2.java |
程序输出结果如图4.1.2 所示:
通过这个程序看到了什么?在run()方法体中,实现了一个倒计时的功 能。线程通过循环控制,每隔一秒输出一次剩余的时间,循环结束时输出"game is over,bye!",线程也随之结束。可见这个程序中新建的线程不是死循环,而是通过一些条件来对线程的起始进行了控制,从而实现了倒计时的功能。
在这个程序中,还可以看到,在给线程起名字的时候可以通过创建线程的时候来实现。因为查阅JDK的帮助文档,会发现Thread类除了默认的构造函 数之外,还有很多带参数的构造函数,只不过在这里是用到了public Thread(String name)这个构造方法。
并不是在创建线程对象的时候给线程起个名字就可以了,还应该在线程类的子类中定义相应的构造函数才行,这个构造函数的形式如下:
SubThread(String name) // 线程子类的构造方法 |
如果不这样做,程序编译会提示错误,读者可以想想为什么。也可以将上面程序中NewThread类的构造方法注释掉,编译一下程序,看到错误提示后,再去思考这个问题。
在这个程序中还用到了try…catch语句,它用来捕获程序中可能发生的异常,而产生异常的原因是程序中使用了Thread.sleep()这样的方法。通过查阅JDK的帮助文档,可以看到线程类的sleep()方法的完整格式如下:
public static void sleep(long millis) throws InterruptedException |
看到这个throws关键字,想必读者就应知道为什么使用try…catch语句了。由于这个方法可能会抛出一个中断异常,因此,有必要在程序调用这个方法时对可能发生的异常进行处理。此外,这个方法是静态的,所以可以通过类名直接调用。
2、实现Runnable接口来创建线程
除了扩展Thread类可以创建线程之外,还可以通过定义一个实现了Runnable接口的类来创建线程。为了将来程序执行时可以进入线程,在这个类中必须实现Runnable接口中唯一提供的run()方法。
示例如下所示:
class OneThread implements Runnable |
当定义好一个实现了Runnable接口的类以后,还不能直接去创建线程对象,要想真正去创建一个线程,还必须在类的内部实例化一个Thread类的对象。此时,会用到Thread 类定义的如下两个构造函数:
public Thread(Runnable target) |
在这两个构造函数中,参数target定义了一个实现了Runnable接口的类的对象引用。新建的线程将来就是要执行这个对象中的run()方法。而新建线程的名字可以通过第二个构造方法中的参数name来指定。
示例如下所示:
OneThread onethread = new OneThread(); |
此时,新线程对象才被创建,如果想要执行该线程的run()方法,则仍然需要通过调用start()方法来实现。例如:
newthread.start(); |
要想创建新的线程对象,这两条语句缺一不可。此后程序会在堆内存中实实在在地创建一个OneThread类的实例对象,该对象中包含了一个线程对象 newthread。newthread对象会通过调用start()方法来执行它自己的run()方法。随着run()方法的结束,线程对象 newthread的生命也将结束,但是onethread对象还会存在于堆内存当中。如果希望在实际编程当中一旦线程结束,即释放与线程有关的所有资源,可以使用创建匿名对象的方法来创建这个线程,格式如下所示:
new Thread(new OneThread).start(); |
这样一来,该线程一旦运行结束,所有与该线程有关的资源都将成为垃圾,这样就可以在特定的时间内被Java的垃圾回收机制予以回收,释放所占用内存,提高程序的效率。
下面这个程序是通过实现Runnable接口来创建的线程,可以将它和前面的例4.1.2的程序进行比较。
// 例4.1.3 ThreadDemo3.java |
编译并运行这个程序,可以看到程序执行的结果和例4.1.2的程序输出的结果是完全一样的,因此,读者可以在创建线程的时候选择任意一种方式来实现
为了使程序达到优异的性能,可以利用创建线程来完成那些任务。因为一个线程就是一个独立的执行通道,在没有特殊的要求之下,多个线程之间彼此独立运行,互不干扰。而且带线程的程序通常比没有带线程的程序运行得要快,因此线程常 用在网络和图形用户界面等程序设计当中,这一优势在多处理器的计算机上更加明显。本节中不仅要理解什么是线程,而且还应掌握两种创建线程的方法,为以后在程序中使用多线程技术打下坚实的基础。
发表评论
-
java以post发送方式实现百度Sitemap实时推送代码分享
2015-06-21 09:48 9241怎么实现百度sitemap实时推送,首先,得拥 ... -
[Java]读取文件方法大全
2012-12-22 16:39 11451、按字节读取文件内容 2、按字符读取文件内容 3、按行读 ... -
Dom4j创建XML文件,对该文件进行修改、格式化以及读取的Demo
2012-11-22 18:04 1772import java.io.File; import ... -
JAVA的文件操作【转】
2012-11-22 14:28 188711.3 I/O 类使用 由于在 IO 操作 ... -
Java文件file操作总结
2012-11-22 14:14 17392010-08-31 15:55 1106人阅读 ... -
java反射详解
2012-11-22 10:29 1080本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的 ... -
Java反射机制的学习
2012-11-22 10:27 1551Java反射机制是 Java 语言被视为准动态语言的关键性 ... -
JAVA:注解(一)
2012-11-20 20:52 1179JAVA:注解(一) (2010-06-24 08:52 ... -
lucene3.6.1 经典案例 入门教程
2012-09-12 10:47 17375第一步:下载lucene的核心包 lucene-core-3 ... -
JAVA 反射详细讲解 实例
2012-08-17 16:06 2595一、反射的含义: Java类的一种自审机制, ... -
Eclipse快捷键大全 (转载)
2012-07-13 19:11 1056eclipse快捷键详细介绍 用的最多Ctrl+1 快 ... -
java时间格式大全1!
2012-07-10 17:13 1147java时间格式大全1! 2007年10月22日 星期 ... -
JUnit 4 使用 Java 5 中的注解(annotation),以下是JUnit 4 常用的几个 annotation 介绍
2012-05-28 17:46 2208JUnit 4 中的Before After Ign ... -
java 静态块、非静态块、静态函数、构造函数 执行顺序
2012-04-01 16:25 9780java中经常有一些静态块 ... -
c:foreach 标签的属性 详细解释
2012-03-27 09:00 2678<c:forEach>标签的使用 2007年03 ... -
java中equals 方法和 == 的区别 (详细)
2012-03-26 11:05 3429equal 和 == 的区别 java中eq ... -
Java HashMap和Hashtable的区别
2011-11-06 16:07 17661、 继承和实现区别 Hashtable是基于陈旧 ... -
java String和StringBuffer的区别
2011-11-06 15:44 1328在java中有3个类来负责字符的操作。 1.Characte ... -
Java int Integer 详解
2011-11-06 15:36 39471.int是基本的数据类 ... -
overload和override的区别 (精简)
2011-11-05 16:04 1120overload和override的区别 overri ...
相关推荐
在 Java 中,创建线程有两种方式:继承 Thread 类和实现 Runnable 接口。这些方式都可以用来创建线程,但它们之间有着一些关键的区别。 继承 Thread 类 继承 Thread 类是 Java 中创建线程的一种方式。这种方式下,...
在Java编程语言中,创建线程有两种主要方式:继承`Thread`类和实现`Runnable`接口。由于Java的单继承特性,当一个类需要继承其他类时,就不能再直接继承`Thread`,这时实现`Runnable`接口就成为创建线程的优选方案。...
- **创建Runnable接口的实现类**:定义一个类,实现`Runnable`接口,并重写`run()`方法,这里的`run()`方法包含线程执行的具体逻辑。 - **创建Runnable实现类的实例**:通过实例化这个实现类,为后续创建`Thread`...
总结来说,Java中的`Thread`类和`Runnable`接口提供了两种创建多线程的方式,它们都可用于实现阶乘计算。理解这些基础概念是进行并发编程的关键,也是提升程序效率的重要手段。在实际应用中,应根据项目需求和最佳...
Java提供了两种主要的方式来创建线程:继承Thread类和实现Runnable接口。本篇文章将深入探讨通过实现Runnable接口来创建线程的方法,以及这种方式相比于直接继承Thread类的优势。 首先,我们来看Runnable接口。在...
继承`Thread`类的方法简洁明了,但在Java中不建议过度使用继承,尤其是为了实现多线程的目的。相比之下,实现`Runnable`接口的方式更加灵活,适用于大多数情况,特别是当一个类已经继承了另一个类的情况下。 #### ...
1. 写两个线程,一个线程打印1-52,另一个线程打印字母A-Z。打印顺序为12A34B56C……5152Z。 学习线程之间的通信协调关系。 2. 使用 runnable 接口实现按两... 使用继承Thread类方式和实现Runnable接口两种方式实现。
Java提供了两种创建线程的方式:继承Thread类和实现Runnable接口。 1. 继承Thread类创建线程: 当你选择继承Thread类时,你需要创建一个新的类,这个类扩展自Thread类。Thread类已经实现了Runnable接口,所以你不...
本文将深入探讨如何通过实现`Runnable`接口和继承`Thread`类两种方式来创建线程,并实现在屏幕上随机画正方形的程序。 首先,让我们了解线程的概念。线程是程序中的单一顺序控制流,一个进程可以包含多个线程,它们...
在Java中,创建多线程有两种主要的方式:继承`Thread`类和实现`Runnable`接口。这两种方式都是为了实现程序的并发执行,即允许多个任务在同一时间片内交替执行。下面我们将详细讨论这两种方法及其区别。 ### 继承...
这种方式的优点是可以避免因为Java的单继承特性所带来的局限性,使得类可以同时继承其他父类和实现多线程的功能。缺点是相对于直接继承`Thread`类,这种方式稍微复杂一点。 **示例程序** ```java // MyRunnable....
在Java编程语言中,创建多线程有两种主要的方法:继承`Thread`类和实现`Runnable`接口。这两种方法都是为了使程序能够同时执行多个任务,从而提高效率和响应性。 **1. 继承Thread类** 当一个类直接继承自`Thread`类...
本篇文档主要探讨了两种实现Java多线程的数据共享方式:通过内部类和实现Runnable接口。以下是对这两种方法的详细解释: 1. **实现Runnable接口**: - **好处**:Java中的`Runnable`接口允许我们将线程逻辑(run()...
Java提供了两种主要的方法来创建线程,分别是直接继承自`Thread`类和实现`Runnable`接口。这两种方法各有其特点和适用场景。 1. **继承Thread类**: 当你选择继承`Thread`类时,你需要创建一个新的类,该类直接...
在Java中,线程可以通过Thread类或Runnable接口来实现。 Runnable接口是Java.lang包中的一部分,它定义了一个run()方法,该方法将被线程执行。Runnable接口的特点包括: * 只有一个run()方法 * 需要创建一个Thread...
Java提供了多种创建多线程的方式,其中最基础的一种是通过继承Thread类来实现。 一、创建和启动线程 1. 概述 Java虚拟机(JVM)支持多线程执行,每个线程都是通过`java.lang.Thread`类的实例来表示的。创建一个...
有两种方法可以实现多线程:继承 Thread 类和实现 Runnable 接口。继承 Thread 类可以通过覆盖 run() 方法来指定线程执行的代码,但是这种方法有一个缺点,那就是假如我们的类已经从一个类继承了,则无法再继承 ...
Java提供了两种主要的方式来创建线程:继承Thread类和实现Runnable接口。本文将详细讲解使用Runnable接口创建线程的方法。 首先,为什么我们要选择实现Runnable接口而不是直接继承Thread类呢?这是因为Java不支持...
Java提供了多种创建线程的方式,其中最常见的是通过继承`Thread`类和实现`Runnable`接口这两种方法。下面将详细阐述这两种创建线程的方法及其区别。 ### 一、通过继承`Thread`类创建线程 当一个类继承了`Thread`类...
2.1 继承Thread类 2.2 实现Runnable接口 3. 实现Runnable接口: 3.1 实现步骤 3.2 优点与用途 4. 启动线程: 4.1 使用Thread类启动线程 4.2 使用Executor框架启动线程池 5. 传递参数给线程: 5.1 使用构造方法传递...