- 浏览: 314759 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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 1710Java中的几种引用类型还是蛮重要的,需要好好理解一下~ ... -
ArrayList 和 LinkedList
2012-03-14 03:11 1745今天有人问这个,发现自己只是大概理解而且只会用了。该忘的竟然忘 ... -
Java总结-图形界面编程
2012-02-14 20:59 1369图形界面编程: java ... -
Java总结-正则表达式
2012-02-14 20:57 1120正则表达式: 专门用于操作字符串的规则。 将一 ... -
Java常用对象
2012-02-11 09:53 881java.lang.System: 该类中的方法都 ... -
集合总结
2012-02-11 09:51 1351Iterator:迭代器。 用来取出Collectio ... -
多线程总结
2012-02-10 10:20 1385多线程: 线程是进程中的一个控制单元。 一个进 ... -
异常总结
2012-02-10 10:18 1000异常: 自定义异常: 在java对一些常见的情况进 ... -
Java总结-面向对象进阶
2012-02-10 10:17 858接口: 它是一个特殊的抽象类。里面都是抽象方法。 ... -
Java总结-继承和抽象
2012-02-10 10:16 1220继承: 提高了代码 ... -
Java总结-构造和内部类
2012-02-10 10:15 957构造函数: 格式: 1,函数名和类名相同。 2 ... -
Java总结-面向对象初步
2012-02-09 14:53 961面向对象: 1,它是一种符合现实中人们思考习惯的一 ... -
Java总结-函数和数组
2012-02-09 14:50 3602函数: 特点: 1,程序中一段独立的小程序。 ... -
Java总结-流程控制
2012-02-09 14:47 1129程序的流程控制; 1 ... -
Java总结-基础
2012-02-09 14:43 947原来的Java笔记 整理了按天传上来~ java语言特性 ... -
IO操作流总结
2012-02-09 09:30 1293import java.io.*; /* ... -
Java排序汇总
2012-02-08 09:35 1200几种简单的排序的 Java 实现 代码注释非常详细~ im ... -
Java排序汇总
2012-02-07 10:48 22几种简单的排序的 Java 实现 代码注释非常详细~ im ... -
JFreeChart核心类库中的核心类的方法详解
2012-02-07 09:23 1396--核心类主要有: org.jfree.chart.JFre ... -
JFreeChart使用心得与例子
2012-02-07 09:22 1733一、JFreeChart的介绍与获 ...
相关推荐
两种方式的优劣比较: - **实现Runnable接口**: - 优点:避免了单继承的限制,可以与其他接口结合使用,适合多个线程共享同一个资源的情况。 - 缺点:需要通过Thread类来创建和启动线程,增加了代码的复杂性。 ...
### Java多媒体与多线程...通过本次实验,学生不仅掌握了Java多线程编程的基础知识,还学会了如何利用多线程优化程序性能,特别是在多媒体应用领域,如动画、音视频处理等,为后续更复杂的应用开发奠定了坚实的基础。
这两种方式各有优劣,前者可以直接调用`start()`方法启动,后者则需将`Runnable`对象传递给`Thread`类的构造器。 2. **线程的状态**:Java线程有五种状态:新建、可运行、运行、阻塞和死亡。了解这些状态有助于理解...
Java多线程的实现主要有两种途径:继承`Thread`类和实现`Runnable`接口。这两种方式各有优劣,但共同目标都是定义线程的行为。继承`Thread`类的方法相对直观,通过重写`run()`方法即可指定线程的运行逻辑。然而,...
### Java多线程程序设计详细解析 #### 一、理解多线程机制 多线程是一种允许多个指令流在程序中并发执行的机制,这些指令流被称为线程,它们在逻辑上是“同时”执行的,但实际上可能由于单个CPU的限制而采取时间片...
总之,"张孝祥Java就业培训教程第五章_多线程"涵盖了Java多线程编程的核心知识,包括线程的创建与管理、同步机制、线程安全的数据结构以及并发工具的使用。掌握这些内容对于成为一名合格的Java开发者至关重要,无论...
两种方式各有优劣,前者可以方便地继承其他类,后者则更适合资源共享。 2. **线程启动与终止**:`start()`方法用于启动线程,此时会调用`run()`方法。而`stop()`方法在Java中已不推荐使用,因为存在安全问题,现在...
在Java等编程语言中,多线程的实现主要有两种方式:继承Thread类和实现Runnable接口。继承Thread类可以直接覆盖run()方法,而实现Runnable接口则需要重写run()方法,并通过Thread对象启动。这两种方式各有优劣,选择...
Java提供了两种创建线程的方式:通过实现Runnable接口或继承Thread类。这两种方法各有优劣,实现Runnable接口更为灵活,因为它可以避免单继承的限制,而直接继承Thread则更方便直接控制线程的行为。 书中深入探讨了...
4. **线程安全类**:如ArrayList不是线程安全的,而Vector和CopyOnWriteArrayList是线程安全的,比较它们在多线程环境下的优劣。 5. **死锁示例**:模拟死锁情况,分析并解决死锁问题,理解死锁条件。 6. **线程...
Java编程中的线程创建是多线程并发编程的核心部分,它允许程序同时执行多个任务,从而提高效率和响应速度。线程有两种主要的创建方式:通过实现`Runnable`...理解这两种方式的差异和适用场景是Java多线程编程的基础。
总结来说,Java多线程中的内置锁和显式锁各有优劣。内置锁简洁易用,但控制有限;显式锁提供了更多灵活性,但使用起来相对复杂。根据具体应用场景选择合适的锁机制,能有效提高并发程序的性能和可维护性。
在Java中,实现多线程功能主要有两种途径:一种是通过实现`Runnable`接口,另一种则是通过继承`Thread`类。这两种方式各有优劣,具体选择哪一种取决于具体的应用场景。 ##### 继承Thread类 1. **基础概念**: - ...
- 线程的创建:通过Thread类和实现Runnable接口两种方式创建线程。 - 线程同步:理解synchronized关键字,掌握wait、notify和notifyAll方法的使用。 - 线程池:了解ExecutorService和ThreadPoolExecutor,如何...
多线程的概念及优劣:** - **定义:**多线程是指在一个程序中包含多个执行路径的技术。 - **优点:** - 提高系统资源的利用率。 - 增强程序的响应性和交互性。 - **缺点:** - 设计复杂度高。 - 存在线程间的...
在中国象棋这个项目中,开发者使用...总的来说,这个Java编写的中国象棋项目涵盖了面向对象编程、图形界面设计、事件处理、数据结构与算法、多线程、异常处理以及文件操作等多个核心Java技术,是一个综合性的编程实践。
这种方法结合了前两种方式的优点,既延迟初始化又避免了不必要的同步。 ```java public class Singleton { private volatile static Singleton instance; private Singleton() {} public static Singleton ...
**多线程的优劣** - **优点:** - 提高CPU利用率。 - 增强应用程序的交互性。 - 提升系统的整体性能。 - **劣势:** - 设计和调试困难。 - 可能导致资源争用问题。 - 存在线程安全问题。 **线程和进程的区别...
1. 多线程/异步:利用Java并发库,如ExecutorService,创建多线程爬虫,同时处理多个URL,提高抓取速度。 2. 并行下载:使用线程池管理下载任务,减少IO阻塞,提高整体效率。 3. 节流与反反爬:设置合理的请求间隔,...
Java提供两种主要的方式来生成随机数:`java.lang.Math.random()` 和 `java.util.Random` 类。这两种方法各有优劣,适用于不同的场景。 #### Math.random() `Math.random()` 是一个简单易用的方法,用于生成一个...