在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限。

下面看例子:

package org.thread.demo;  
class MyThread extends Thread{  
private String name;  
public MyThread(String name) {  
super();  
this.name = name;  
}  
public void run(){  
for(int i=0;i<10;i++){  
System.out.println("线程开始:"+this.name+",i="+i);  
}  
}  
}  
package org.thread.demo;  
public class ThreadDemo01 {  
public static void main(String[] args) {  
MyThread mt1=new MyThread("线程a");  
MyThread mt2=new MyThread("线程b");  
mt1.run();  
mt2.run();  
}  

但是,此时结果很有规律,先第一个对象执行,然后第二个对象执行,并没有相互运行。在JDK的文档中可以发现,一旦调用start()方法,则会通过JVM找到run()方法。下面启动start()方法启动线程:

package org.thread.demo;  
public class ThreadDemo01 {  
public static void main(String[] args) {  
MyThread mt1=new MyThread("线程a");  
MyThread mt2=new MyThread("线程b");  
mt1.start();  
mt2.start();  
}  
}; 
这样程序可以正常完成交互式运行。那么为啥非要使用start();方法启动多线程呢?

在JDK的安装路径下,src.zip是全部的java源程序,通过此代码找到Thread中的start()方法的定义,可以发现此方法中使用了private native void start0();其中native关键字表示可以调用操作系统的底层函数,那么这样的技术成为JNI技术(java Native Interface)

Runnable接口

在实际开发中一个多线程的操作很少使用Thread类,而是通过Runnable接口完成。

public interface Runnable{  
public void run();  

例子:

package org.runnable.demo;  
class MyThread implements Runnable{  
private String name;  
public MyThread(String name) {  
this.name = name;  
}
public void run(){  
for(int i=0;i<100;i++){  
System.out.println("线程开始:"+this.name+",i="+i);  
}  
}  
}; 
但是在使用Runnable定义的子类中没有start()方法,只有Thread类中才有。此时观察Thread类,有一个构造方法:public Thread(Runnable targer)此构造方法接受Runnable的子类实例,也就是说可以通过Thread类来启动Runnable实现的多线程。(start()可以协调系统的资源):

package org.runnable.demo;  
import org.runnable.demo.MyThread;  
public class ThreadDemo01 {  
public static void main(String[] args) {  
MyThread mt1=new MyThread("线程a");  
MyThread mt2=new MyThread("线程b");  
new Thread(mt1).start();  
new Thread(mt2).start();  
}  

两种实现方式的区别和联系:

在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处:

避免点继承的局限,一个类可以继承多个接口。
适合于资源的共享
以卖票程序为例,通过Thread类完成:

package org.demo.dff;  
class MyThread extends Thread{  
private int ticket=10;  
public void run(){  
for(int i=0;i<20;i++){  
if(this.ticket>0){  
System.out.println("卖票:ticket"+this.ticket--);  
}  
}  
}  
}; 
下面通过三个线程对象,同时卖票:

package org.demo.dff;  
public class ThreadTicket {  
public static void main(String[] args) {  
MyThread mt1=new MyThread();  
MyThread mt2=new MyThread();  
MyThread mt3=new MyThread();  
mt1.start();//每个线程都各卖了10张,共卖了30张票  
mt2.start();//但实际只有10张票,每个线程都卖自己的票  
mt3.start();//没有达到资源共享  
}  

如果用Runnable就可以实现资源共享,下面看例子:

package org.demo.runnable;  
class MyThread implements Runnable{  
private int ticket=10;  
public void run(){  
for(int i=0;i<20;i++){  
if(this.ticket>0){  
System.out.println("卖票:ticket"+this.ticket--);  
}  
}  
}  
}  
package org.demo.runnable;  
public class RunnableTicket {  
public static void main(String[] args) {  
MyThread mt=new MyThread();  
new Thread(mt).start();//同一个mt,但是在Thread中就不可以,如果用同一  
new Thread(mt).start();//个实例化对象mt,就会出现异常  
new Thread(mt).start();  
}  
};

Runnable Thread分析比较相关推荐

  1. java 自带thread分析工具_java自带的jvm分析工具

    这段时间觉得很有必要对java的内存分析工具进行熟悉,这样以后出现机器负载较高,或者反应很慢的时候,我就可以查找原因了.上网搜了搜,发现下面这些是比较常用的,然后我在机器上试试了,把结果也贴出来哈. ...

  2. Android如何让Handler中内部run停止(runnable/thread)

    [声明]此文转载自:http://www.bubuko.com/infodetail-669650.html --尊重作者,知识无价,交流无限! 一.先看图片,一目了然: 二.再看代码,了然于胸: A ...

  3. java 文件存储 搜索_Java并发(Runnable+Thread)实现硬盘文件搜索功能

    零.插播2020CSDN博客之星投票新闻 近日(1月11日-1月24日),2020CSDN博客之星评选正在火热进行中,作为码龄1年的小白有幸入选Top 200,首先很感谢CSDN官方把我选上,本来以为 ...

  4. java线程的简单例子(Thread and runnable)

    http://interper56-sohu-com.iteye.com/blog/172303 其实要了解java多线程只需要理解以下几个事情: 1) java.lang.Thraed类 2) ja ...

  5. 02.并发编程(2)Thread类源码分析

    概述 在说线程之前先说下进程,进程和线程都是一个时间段的描述,是CPU工作时间段的描述. 进程,是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竟争计算机系统资源的基本单位.每一 ...

  6. 怎样分析 JAVA 的 Thread Dumps

    当有障碍,或者是一个基于 JAVA 的 WEB 应用运行的比预期慢的时候,我们需要使用 thread dumps.如果对于你来说, thread dumps 是非常复杂的,这篇文章或许能对你有所帮助. ...

  7. java 怎样 thread dump_怎样分析 JAVA 的 Thread Dumps

    展开全部 当有障碍,或者是一个基于 JAVA 的 WEB 应用运行的比预期32313133353236313431303231363533e58685e5aeb931333337623537慢的时候, ...

  8. thread dump分析

    一.thread dump信息获取 1.发送信号 * In Unix, use "kill -3 <pid>" where pid is the Process ID ...

  9. 线程的状态 Thread.State||NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED

    public enum State {/*** Thread state for a thread which has not yet started.*/NEW,(新建)/*** Thread st ...

最新文章

  1. 理解Docker——深入引擎室
  2. 九九乘法表口诀python-Python用for循环实现九九乘法表
  3. python爬虫工程师-Python-爬虫工程师-面试总结
  4. c++ 异步下获取线程执行结果_【分享吧】C++11多线程库介绍
  5. boost::geometry::index::intersects用法的测试程序
  6. android 5.0新增 ui 控件,android3.0新增ui控件示例说明.doc
  7. SSM运行异常 org.springframework.beans.factory.UnsatisfiedDependencyException
  8. Windows下配置Apache服务器
  9. Django rest framework 序列化组件
  10. 汉字unicode编码范围
  11. TCP Socket通信详细过程
  12. mysql菜鸟教程 文档_mysql菜鸟教程
  13. 语c语言描写,【萌°语c】『语c』语c基本知识的简单介绍
  14. 抖音测试图文内容一级流量入口
  15. 判断是否保持函数依赖
  16. Navicat连接mysql报错is not allowed to connect to this MySQL
  17. 如何有效训练你的研究能力
  18. MybatisPlus核心功能——实现CRUD增删改查操作 (包含条件构造器)
  19. 穿过任意防火墙NAT的远程控制软件TeamViewer
  20. Sandbox 入门(打包、安装、启动、调试、日志)

热门文章

  1. oracle 日期 加一秒,Leap Second (闰秒) 在ORACLE环境的影响
  2. 型人格 disc测试_什么是孤独型人格,如何测试筛查孤独型人格?
  3. JAVA学习-数组元素排序
  4. python utc时间如何取整_Python和Pandas:如何在不同的分辨率上取整unix时间戳(utc):1min5min15min30min1d?...
  5. C#中的三层前馈神经网络,带有图形显示
  6. 在Raspberry Pi上轻松设置.NET Core并使用VS Code进行远程调试
  7. IndexedQueueT——C#中的自定义队列
  8. linuc和python常用命令是一样的么_linuc和python常用命令是一样的么_python教程3--《linux常用命令》...
  9. mysql根据月份查询订单销售额
  10. mysql新增表字段回滚_MySql学习笔记四