- 浏览: 307388 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
u011076522:
写的确实不错,总结的很好,内容大都属实
C/C++内存分配方式 -
水晶魔方:
...
联合编译工具推荐IncrediBuild -
caiwb1990:
又看了一遍~ 越看越清晰~
C/C++内存分配方式 -
caiwb1990:
每次准备面试的时候来瞅瞅。timer_yin 写道好文,正好补 ...
TCP/IP、Http、Socket的区别【转】 -
caiwb1990:
互相学习~kongxuan 写道这个不错,用简单的话将事情讲明 ...
TCP/IP、Http、Socket的区别【转】
1、通过实现Runnable接口线程创建
(1).定义一个类实现Runnable接口,重写接口中的run()方法。在run()方法中加入具体的任务代码或处理逻辑。
(2).创建Runnable接口实现类的对象。
(3).创建一个Thread类的对象,需要封装前面Runnable接口实现类的对象。(接口可以实现多继承)
(4).调用Thread对象的start()方法,启动线程
2、通过继承Thread类创建线程
(1).首先定义一个类去继承Thread父类,重写父类中的run()方法。在run()方法中加入具体的任务代码或处理逻辑。
(2).直接创建一个ThreadDemo2类的对象,也可以利用多态性,变量声明为父类的类型。
(3).调用start方法,线程t启动,隐含的调用run()方法。
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()方法。
(1).定义一个类实现Runnable接口,重写接口中的run()方法。在run()方法中加入具体的任务代码或处理逻辑。
(2).创建Runnable接口实现类的对象。
(3).创建一个Thread类的对象,需要封装前面Runnable接口实现类的对象。(接口可以实现多继承)
(4).调用Thread对象的start()方法,启动线程
.package demo.thread; public class TreadDemo1 implements Runnable { private int countDown = 10; @Override // 在run方法中定义任务 public void run() { while (countDown-- > 0) { System.out.println("#" + Thread.currentThread().getName() + "(" + countDown + ")"); } } public static void main(String[] args) { // Runnable中run方法是一个空方法,并不会产生任何线程行为,必须显式地将一个任务附着到线程上 TreadDemo1 tt=new TreadDemo1(); new Thread(tt).start(); new Thread(tt).start(); System.out.println("火箭发射前倒计时:"); } }
#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()方法。
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("火箭发射前倒计时:"); } } 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()方法。
发表评论
-
Java中GC和引用
2012-03-18 00:01 1666Java中的几种引用类型还是蛮重要的,需要好好理解一下~ ... -
ArrayList 和 LinkedList
2012-03-14 03:11 1705今天有人问这个,发现自己只是大概理解而且只会用了。该忘的竟然忘 ... -
Java总结-图形界面编程
2012-02-14 20:59 1333图形界面编程: java ... -
Java总结-正则表达式
2012-02-14 20:57 1094正则表达式: 专门用于操作字符串的规则。 将一 ... -
Java常用对象
2012-02-11 09:53 834java.lang.System: 该类中的方法都 ... -
集合总结
2012-02-11 09:51 1325Iterator:迭代器。 用来取出Collectio ... -
多线程总结
2012-02-10 10:20 1352多线程: 线程是进程中的一个控制单元。 一个进 ... -
异常总结
2012-02-10 10:18 962异常: 自定义异常: 在java对一些常见的情况进 ... -
Java总结-面向对象进阶
2012-02-10 10:17 827接口: 它是一个特殊的抽象类。里面都是抽象方法。 ... -
Java总结-继承和抽象
2012-02-10 10:16 1181继承: 提高了代码 ... -
Java总结-构造和内部类
2012-02-10 10:15 922构造函数: 格式: 1,函数名和类名相同。 2 ... -
Java总结-面向对象初步
2012-02-09 14:53 927面向对象: 1,它是一种符合现实中人们思考习惯的一 ... -
Java总结-函数和数组
2012-02-09 14:50 3570函数: 特点: 1,程序中一段独立的小程序。 ... -
Java总结-流程控制
2012-02-09 14:47 1105程序的流程控制; 1 ... -
Java总结-基础
2012-02-09 14:43 916原来的Java笔记 整理了按天传上来~ java语言特性 ... -
IO操作流总结
2012-02-09 09:30 1260import java.io.*; /* ... -
Java排序汇总
2012-02-08 09:35 1144几种简单的排序的 Java 实现 代码注释非常详细~ im ... -
Java排序汇总
2012-02-07 10:48 22几种简单的排序的 Java 实现 代码注释非常详细~ im ... -
JFreeChart核心类库中的核心类的方法详解
2012-02-07 09:23 1354--核心类主要有: org.jfree.chart.JFre ... -
JFreeChart使用心得与例子
2012-02-07 09:22 1699一、JFreeChart的介绍与获 ...
相关推荐
Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 Java线程:线程的调度-...
Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 Java线程:线程...
JAVA线程的两种创建方式及优劣比较.pdf
Java线程:创建与启动 7 Java线程:线程名称的设定及获取 10 Java线程:线程栈模型与线程的变量 12 Java线程:线程的调度-休眠 13 Java线程:线程的调度-优先级 16 Java线程:线程的调度-让步 19 Java线程:线程的...
1、Java有两种实现多线程的方式:通过Runnable接口、通过Thread直接实现,请掌握这两种实现方式,并编写示例程序。 2、多线程是并发执行的,交替占有cpu执行,请编写示例程序,并观察输出结果。 3、采用线程同步方法...
java多线程总结
Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 Java线程:线程的调度-...
该文档总结了Java多线程相关的知识点,分享给大家,简单易懂!
Java多线程读大文件 java多线程写文件:多线程往队列中写入数据
java多线程PPT 多线程基本概念 创建线程的方式 线程的挂起与唤醒 多线程问题
Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式...
Java多线程--对比创建多线程的两种方式
自己学着编写的一个JAVA多线程程序,该程序实现的功能是:在主线程main中创建两个子线程,A和B,线程A先运行,再运行B线程,当两个子线程都运行完毕后,才运行主线程,并最终结束整个程序的运行。 希望该程序对初学...
Java多线程的重要性可想而知,而对于多线程,某些情况下,又比较难理解,稍微参照网上的资料进行了总结
多线程两种实现方式Java,MLDN,实训课程中的多线程
JAVA多线程总结
java 多线程 哲学家思考问题 java 多线程 哲学家思考问题 ...java 多线程 哲学家思考问题java 多线程 哲学家思考问题java 多线程 哲学家思考问题java 多线程 哲学家思考问题 java 多线程 哲学家思考问题
一个java 多线程操作数据库应用程序!!!