大家都知道多线程可以通过两种方式来创建。
一、通过继承Thread类
二、通过实现Runnable接口
那么中两种方式到底有什么区别呢?那种方式更好些呢?
我们使用多线程,无非就是想利用多线程的优点,来更好的实现我们的想法。
多线程有哪些优点呢?
一、多线程共享同一块内存空间和一组系统资源
二、线程本身的数据通常都是只有微处理器的寄存器数据,以及供程序执行的堆栈。所以系统在产生一个线程或者线程的切换要比进程系统的负担小很多。
现在我们来了解一些Thread类。
public class ThreadDemo
{ public static void main(String []args) { ThreadTest t=new ThreadTest(); t.start(); t.start(); t.start(); t.start(); } } class ThreadTest extends Thread { private int count=10; public void run() { while(count>0) { System.out.println(Thread.currentThread().getName()+" "+count--); } } }
运行后,我们发现其实只启动了一个线程。
是不是程序有问题呢?我们修改一下程序。
public class ThreadDemo { public static void main(String []args) { new ThreadTest().start(); new ThreadTest().start(); new ThreadTest().start(); new ThreadTest().start(); } } class ThreadTest extends Thread { private int count=10; public void run() { while(count>0) { System.out.println(Thread.currentThread().getName()+" "+count--); } } }
再次运行,发现这四个线程对象各自占有各自的资源,并不是同时完成统一任务。
我们可以得出结论:Thread类实际上无法达到资源共享的目的。
那么,Runnable接口能不能达到这一目的呢?
我们大可试一下。
public class ThreadDemo { public static void main(String []args) { ThreadTest test=new ThreadTest(); new Thread(test).start(); new Thread(test).start(); new Thread(test).start(); new Thread(test).start(); } } class ThreadTest implements Runnable { private int count=10; public void run() { while(count>0) { System.out.println(Thread.currentThread().getName()+" "+count--); } } }
运行之后我们发现,这四个线程同时完成了我们需要完成的任务。
通过以上比较我们即可得出Thread与Runnable的区别:
1、Runnable适合于多个相同程序代码线程去处理统一资源的情况,把虚拟的cpu(线程)同程序的代码,数据有效分离,较好体现面向对象的编程的思想
2、Runnable可以避免由于java的单继承机制带来的局限。可以再继承其他类的同时,还能实现多线程的功能。
3、Runnable能增加程序的健壮性。代码能够被多个线程共享。
评论
1 楼
YorkTsai
2013-10-23
对Thread的测试,修改成这样
public class ThreadDemo
{
public static void main(String []args)
{ ThreadTest tt = new ThreadTest();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
}
}
class ThreadTest extends Thread
{
private int count=10;
public void run()
{
while(count>0)
{
System.out.println(Thread.currentThread().getName()+" "+count--);
}
}
}
也可以达到Runnable的资源共享的目的,
所以,认为Thread无法资源共享,这个说法值得再推敲。。
public class ThreadDemo
{
public static void main(String []args)
{ ThreadTest tt = new ThreadTest();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
}
}
class ThreadTest extends Thread
{
private int count=10;
public void run()
{
while(count>0)
{
System.out.println(Thread.currentThread().getName()+" "+count--);
}
}
}
也可以达到Runnable的资源共享的目的,
所以,认为Thread无法资源共享,这个说法值得再推敲。。
发表评论
-
java设计模式
2012-04-20 16:45 1129一、什么是软件设计模式? 设计模式:是一套被反复使用、多数 ... -
I/O流与文件
2012-02-06 15:22 781I/O流 字节输入流:InputStream类为所有 ... -
多线程
2012-02-06 15:23 703多线程: 进程与线程: 进程:同一个操作系统中 ... -
布局管理器与事件处理
2012-02-06 15:23 818图形界面: 布局管 ... -
异常与图形界面
2012-02-06 15:23 663异常: 异常的分类 ... -
反射与内部类
2012-02-06 15:24 1001反射: 反射:在运行时动态分析或使用一个类进行工作。 ... -
java集合框架
2012-03-26 19:33 820集合:保存多个其他对象的对象,不能保存简单类型 Li ... -
抽象类与接口
2012-02-05 19:17 681修饰符abstract:抽象 ... -
关键字
2012-02-05 19:14 625修饰符static: 把对 ... -
类与对象
2012-02-05 19:13 633类和对象: 类:主观抽象,是对象的模板,可以实例化对 ... -
java环境配置与基本概念
2012-02-05 19:11 613配置java环境变量: JAVA_HOME:配置JD ... -
运算符、流程控制以及数组
2012-02-05 19:09 719局部变量:不是声明 ... -
登陆界面的开发
2012-01-08 17:36 739在开发登陆界面的前面,我们先须要熟悉和熟练构造方法,构造方法 ... -
类与对象
2012-01-08 16:54 696什么是面向对象的编程? OOP:1、在程序中模拟现实世界中的 ... -
类与对象
2012-01-08 16:50 706什么是面向对象的编程? OOP:1、在程序中模拟现实世界中的 ... -
java中能当做基本数据类型的类String
2012-01-08 15:47 733String是java中的一个类,而不是一种基 ... -
java虚拟机与java跨平台运行的关系
2012-01-08 15:24 9351、现写一个简单的java小程序 publicv cl ... -
java中的关键字
2011-11-19 23:45 722最近系统的学习了java的关键字,我才发现原来不知 ... -
与java第一次亲密的接触
2011-11-01 21:58 707刚开始学JAVA时,只知道不停的看书。从 ...
相关推荐
thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread ...
System.out.println("Activity-->"+ Thread.currentThread().getName()); } Runnable r = new Runnable() { @Override public void run() { // TODO Auto-generated method stub try { Thread...
rt-thread nano 适配 新塘M031LE3AE keil 工程
线程创建,线程等待与清除,thread_clean.c,thread_create.c,thread_create.c,thread_exit_struct.c,thread_id.c,thread_int.c, thread_join.c, thread_join.c, thread_string.c, thread_struct.c
STM32可以有STM32CubeMX轻松移植THreadX,雅特力从AT43F435/437系列开始不能完全兼容STM32,用不了THreadX了。 本移植采用最新(截至2023年3月12号)的AT32F435/437固件库V2.1.2,THreadX版本V6.2.1;依照雅特力官方...
基于RT-Thread 数字焊机与工业机器人通信网关.zip基于RT-Thread 数字焊机与工业机器人通信网关.zip基于RT-Thread 数字焊机与工业机器人通信网关.zip基于RT-Thread 数字焊机与工业机器人通信网关.zip基于RT-Thread ...
本文讲述了threadX rtos,是一个实时系统, 多线程.
第一章 ThreadX 概述及其与嵌入式实时系统的关系。 第二章 安装步骤及使用事项。 第三章 详细介绍高性能实时内核——ThreadX 的功能操作。 第四章 详细介绍ThreadX 应用程序的接口。 第五章 介绍ThreadX 应用程序的...
是第一次在C#中接触Thread,自己研究了一下其中Thread.Join()这个方法,下面谈谈自己的理解。 Thread.Join()在MSDN中的解释很模糊:Blocks the calling thread until a thread terminates 有两个主要问题: ...
RTOS RT-THREAD标准库参考工程
赠送jar包:transmittable-thread-local-2.12.1.jar; 赠送原API文档:transmittable-thread-local-2.12.1-javadoc.jar; 赠送源代码:transmittable-thread-local-2.12.1-sources.jar; 赠送Maven依赖信息文件:...
继承Thread类: 1必须重写run 方法:里面放置的实际的线程体 2 启动线程: 3创建Thread对象 4调用Thread对象的start 方法启动线程
底层移植、驱动层,这层与硬件密切相关,由Drivers和CPU移植相构成。 硬实时内核,这层是RT-Thread的核心,包括了内核系统中对象的实现,例如多线程及其调度,信号量,邮箱,消息队列,内存管理,定时器等实现。 ...
CountDownLatch与thread.join()的区别
Java中Runnable和Thread的区别
ThreadX是优秀的硬实时操作系统(RTOS),适用于深嵌入式应用中,具有规模小、实时性强、可靠性高、无产品版权费、易于使用等特点,并且支持大量的处理器和SoC,包括ARM、PowerPC、SH 4、MIPS、ADI DSP、TI DPS、Nios ...
rtthread nano的模板,有基本的内核部分,可以完成线程调度、信号量传递等等
正点原子精英版国产操作系统RT-THREAD程序源码,注意: 1.使用前请安装 rt-thread.rtthread.2.1.1,否则编译通不过; 2.编译器为MDK5,请确保版本>5.14,否则 rt-thread.rtthread.2.1.1安装失败。
赠送jar包:transmittable-thread-local-2.12.2.jar; 赠送原API文档:transmittable-thread-local-2.12.2-javadoc.jar; 赠送源代码:transmittable-thread-local-2.12.2-sources.jar; 赠送Maven依赖信息文件:...
2022年RT-Thread全球技术大会国内专场PPT合集(31份)。 C RTOS中的RUST应用 CherryUSB协议栈的原理与使用 RISCV指令集开源软件生态 RNDIS设备驱动框架 RT-Thread 电源管理组件 RT-Thread 构建配置系统 RT-Thread ...