java多线程总结一: 线程的两种创建方式及优劣比较

wlcy1988 2011-11-24 10:07:44
加精
1、通过实现Runnable接口线程创建

(1).定义一个类实现Runnable接口,重写接口中的run()方法。在run()方法中加入具体的任务代码或处理逻辑。

(2).创建Runnable接口实现类的对象。

(3).创建一个Thread类的对象,需要封装前面Runnable接口实现类的对象。(接口可以实现多继承)

(4).调用Thread对象的start()方法,启动线程

示例代码:

01.package demo.thread;
02.
03.public class TreadDemo1 implements Runnable {
04. private int countDown = 10;
05. @Override
06. // 在run方法中定义任务
07. public void run() {
08. while (countDown-- > 0) {
09. System.out.println("#" + Thread.currentThread().getName() + "("
10. + countDown + ")");
11. }
12. }
13.
14. public static void main(String[] args) {
15. // Runnable中run方法是一个空方法,并不会产生任何线程行为,必须显式地将一个任务附着到线程上
16. TreadDemo1 tt=new TreadDemo1();
17. new Thread(tt).start();
18. new Thread(tt).start();
19. System.out.println("火箭发射前倒计时:");
20. }
21.}
22.
运行结果:

火箭发射前倒计时:
#Thread-1(8)
#Thread-1(7)
#Thread-1(6)
#Thread-1(5)
#Thread-1(4)
#Thread-1(3)
#Thread-1(2)
#Thread-1(1)
#Thread-1(0)
#Thread-0(9)

2、通过继承Thread类创建线程

(1).首先定义一个类去继承Thread父类,重写父类中的run()方法。在run()方法中加入具体的任务代码或处理逻辑。
(2).直接创建一个ThreadDemo2类的对象,也可以利用多态性,变量声明为父类的类型。

(3).调用start方法,线程t启动,隐含的调用run()方法。

示例代码:

view plaincopy to clipboardprint?
01.package demo.thread;
02.
03.public class ThreadDemo2 extends Thread {
04. private int countDown = 10;
05.
06. @Override
07. // 在run方法中定义任务
08. public void run() {
09. while (countDown-- > 0) {
10. System.out.println("#" + this.getName() + "(" + countDown + ")");
11. }
12. }
13.
14. public static void main(String[] args) {
15. new ThreadDemo2().start();
16. new ThreadDemo2().start();
17. // 由于start方法迅速返回,所以main线程可以执行其他的操作,此时有两个独立的线程在并发运行
18. System.out.println("火箭发射前倒计时:");
19. }
20.}
21.
package demo.thread;

public class ThreadDemo2 extends Thread {
private int countDown = 10;

@Override
// 在run方法中定义任务
public void run() {
while (countDown-- > 0) {
System.out.println("#" + this.getName() + "(" + countDown + ")");
}
}

public static void main(String[] args) {
new ThreadDemo2().start();
new ThreadDemo2().start();
// 由于start方法迅速返回,所以main线程可以执行其他的操作,此时有两个独立的线程在并发运行
System.out.println("火箭发射前倒计时:");
}
}
运行结果:

#Thread-0(9)
#Thread-0(8)
#Thread-0(7)
#Thread-0(6)
#Thread-0(5)
#Thread-0(4)
#Thread-0(3)
#Thread-0(2)
#Thread-0(1)
#Thread-0(0)
火箭发射前倒计时:
#Thread-1(9)
#Thread-1(8)
#Thread-1(7)
#Thread-1(6)
#Thread-1(5)
#Thread-1(4)
#Thread-1(3)
#Thread-1(2)
#Thread-1(1)
#Thread-1(0)
3、两种方式的比较

首先分析两种方式的输出结果,同样是创建了两个线程,为什么结果不一样呢?

使用实现Runnable接口方式创建线程可以共享同一个目标对象(TreadDemo1 tt=new TreadDemo1();),实现了多个相同线程处理同一份资源。

然后再看一段来自JDK的解释:

Runnable 接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为run 的无参数方法。

设计该接口的目的是为希望在活动时执行代码的对象提供一个公共协议。例如,Thread 类实现了Runnable。激活的意思是说某个线程已启动并且尚未停止。

此外,Runnable 为非 Thread 子类的类提供了一种激活方式。通过实例化某个Thread 实例并将自身作为运行目标,就可以运行实现 Runnable 的类而无需创建 Thread 的子类。大多数情况下,如果只想重写run() 方法,而不重写其他 Thread 方法,那么应使用 Runnable 接口。这很重要,因为除非程序员打算修改或增强类的基本行为,否则不应为该类创建子类。

采用继承Thread类方式:
(1)优点:编写简单,如果需要访问当前线程,无需使用Thread.currentThread()方法,直接使用this,即可获得当前线程。
(2)缺点:因为线程类已经继承了Thread类,所以不能再继承其他的父类。
采用实现Runnable接口方式:
(1)优点:线程类只是实现了Runable接口,还可以继承其他的类。在这种方式下,可以多个线程共享同一个目标对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。
(2)缺点:编程稍微复杂,如果需要访问当前线程,必须使用Thread.currentThread()方法。

原文地址:http://g.csdn.net/5203279


...全文
1008 点赞 收藏 52
写回复
52 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
qiangfu_99 2011-11-29
写的还不错
回复
ryomae 2011-11-29
还是蛮不错的...
回复
helloben123 2011-11-28
收藏起来,慢慢看。
回复
线程是java中的一个难点,在应用的过程中要多做测试!
回复
wto3659123 2011-11-27
最近正在学习多线程,正好在学习一番
回复
你指的应该是线程所执行任务的创建方式吧?

Thread 也实现了 Runnable 接口,其本质也是个 Runnable 类型,所以谈不上两种!
回复
脆旋风 2011-11-27
不错哦!
回复
LiuQianQianMoney 2011-11-27
厉害, 支持一下
回复
jpliua 2011-11-26
简单易懂..
回复
测试通过 顶
回复
目前做了几个SSH的小项目,根本就没有用到多线程,
楼主能说说具体的应用案例吗?谢谢~
回复
Rollo423 2011-11-25
我表示其实没有很看懂……囧
回复
Enjoy 2011-11-25
光看代码可不行,最好复制到电脑上运行看看,一切以亲自实践为原则。
回复
洞凡都都 2011-11-25
推荐大家搞一下测试,好多情况下多线程是不能提高效率的
回复
xiaocongzhi 2011-11-25
Awesome,收藏起来
回复
码仔2020 2011-11-25
多线程用得多吗??
回复
liveths 2011-11-25
感觉java越来越不给力
回复
scrack 2011-11-25
这贴也被推荐了
回复
liuhui168168 2011-11-25
线程是java中的一个难点,在应用的过程中要多做测试!
回复
lmc158 2011-11-25
1、通过实现Runnable接口线程创建

(1).定义一个类实现Runnable接口,重写接口中的run()方法。在run()方法中加入具体的任务代码或处理逻辑。

(2).创建Runnable接口实现类的对象。

(3).创建一个Thread类的对象,需要封装前面Runnable接口实现类的对象。(接口可以实现多继承)

(4).调用Thread对象的start()方法,启动线程

回复
加载更多回复
相关推荐
发帖
英特尔边缘计算技术
创建于2007-08-27

452

社区成员

英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
申请成为版主
帖子事件
创建了帖子
2011-11-24 10:07
社区公告
暂无公告