用继承thread或实现Runnable接口实现线程的区别
来源:互联网 发布:悟空源码 编辑:程序博客网 时间:2024/05/29 18:55
以前以为这两种方法实现线程的效果是一样的,只会写的方法不一样罢了,可是今天通过一个多线程程序发现了他们的区别,首先我们先来对比一下下面的两个例子:
首先我们先来看一个继承thread实现的多线程的卖票问题:
package threadtest;class mythread extends Thread { private int tricket = 10; public mythread(String name) { // TODO Auto-generated constructor stub super(name); } public void run() { // TODO Auto-generated method stub while (true) { if (tricket > 0) { try { Thread.sleep(100); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } System.out.println(currentThread().getName() + " " + tricket-- + "号票"); } } }}class myrunnable implements Runnable { private int tricket = 10; public void run() { // TODO Auto-generated method stub while (true) { if (tricket > 0) { try { Thread.sleep(100); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " " + tricket-- + "号票"); } } }}public class test { public static void main(String[] args) { mythread thread1=new mythread("1号售票点"); mythread thread2=new mythread("2号售票点"); thread1.start(); thread2.start(); }}
代码运行的结果:
然后我们用runnable接口实现以下
package threadtest;class mythread extends Thread { private int tricket = 10; public mythread(String name) { // TODO Auto-generated constructor stub super(name); } public void run() { // TODO Auto-generated method stub while (true) { if (tricket > 0) { try { Thread.sleep(100); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } System.out.println(currentThread().getName() + " " + tricket-- + "号票"); } } }}class myrunnable implements Runnable { private int tricket = 10; public void run() { // TODO Auto-generated method stub while (true) { if (tricket > 0) {// try {// Thread.sleep(100);// } catch (Exception e) {// // TODO: handle exception// e.printStackTrace();// } System.out.println(Thread.currentThread().getName() + " " + tricket-- + "号票"); } } }}public class test { public static void main(String[] args) {// mythread thread1=new mythread("1号售票点");// mythread thread2=new mythread("2号售票点");// thread1.start();// thread2.start(); myrunnable runnable=new myrunnable(); Thread thread1=new Thread(runnable, "1号售票点"); Thread thread2=new Thread(runnable, "2号售票点"); thread1.start(); thread2.start(); }}
运行结果是:
为什么会出现这种结果呐。我们不妨做个比喻,其实刚的程序,
继承Thread类的,我们相当于拿出三件事即三个卖票10张的任务分别分给三个窗口,他们各做各的事各卖各的票各完成各的任务,因为MyThread继承Thread类,所以在new MyThread的时候在创建三个对象的同时创建了三个线程;
实现Runnable的, 相当于是拿出一个卖票10张得任务给三个人去共同完成,new MyThread相当于创建一个任务,然后实例化三个Thread,创建三个线程即安排三个窗口去执行。
用图表示如下:
在我们刚接触的时候可能会迷糊继承Thread类和实现Runnable接口实现多线程,其实在接触后我们会发现这完全是两个不同的实现多线程,一个是多个线程分别完成自己的任务,一个是多个线程共同完成一个任务。
其实在实现一个任务用多个线程来做也可以用继承Thread类来实现只是比较麻烦,一般我们用实现Runnable接口来实现,简洁明了。大多数情况下,如果只想重写 run() 方法,而不重写其他 Thread 方法,那么应使用 Runnable 接口。这很重要,因为除非程序员打算修改或增强类的基本行为,否则不应为该类(Thread)创建子类。
0 0
- 用继承thread或实现Runnable接口实现线程的区别
- 启动线程的五种方式方法(通过继承Thread类或实现Runnable接口)
- Java中继承thread类与实现Runnable接口的区别(实现线程)
- 线程实现方式-继承Thread类和实现Runnable接口的区别
- 通过继承Thread类和通过实现Runnable接口 创建线程的区别
- 细说继承Thread类和实现Runnable接口来创建线程的区别
- 继承Thread类和实现Runnable接口的区别。
- 继承Thread父类和实现Runnable接口的区别
- Java 继承Thread类和实现Runnable接口的区别
- Java 继承Thread类和实现Runnable接口的区别
- 继承thread和实现runnable的区别
- Java线程示例 - 继承Thread类和实现Runnable接口
- 创建线程继承Thread和实现Runnable接口
- 实现多线程的两种方法:继承Thread类或实现Runnable接口
- thread与runnable实现线程的区别
- 线程的创建:实现Runnable接口和继承Thread类,(倒计时的实现)
- java中的通过继承Thread和实现Runnable接口实现的线程
- JAVA 线程的两种基本实现方法(继承Thread类和实现Runnable接口)
- 第三方框架介绍
- Hadoop namenode无法启动
- IIS7的应用程序池详细解析
- Linux常用命令
- web.xml文件的作用及基本配置
- 用继承thread或实现Runnable接口实现线程的区别
- IL常见指令
- 2015年的系统架构师大会随感
- zoj Modular Inverse 3609 (拓展欧几里德)
- LinuxCNC+EtherCAT(6)之LinuxCNC使用,翻译
- CentOS 6.5 (CentOS 7)安装过程记录
- 开发:日期格式的处理(日期终结者)
- Intent中的四个重要属性——Action、Data、Category、Extras
- 测试用例的编写