若是一个类继承Thread,则不适合资源共享。可是若是实现了Runable接口的话,则很容易的实现资源共享。java
实现Runnable接口比继承Thread类所具备的优点:多线程
1):适合多个相同的程序代码的线程去处理同一个资源dom
2):能够避免java中的单继承的限制jvm
3):增长程序的健壮性,代码能够被多个线程共享,代码和数据独立ide
直接看代码:学习
一、继承Thread的demothis
package com.multithread.learning; /** *多线程学习,继承Thread,资源不能共享 *@author */ class Thread1 extends Thread{ private int count=5; private String name; public Thread1(String name) { this.name=name; } public void run() { for (int i = 0; i < 5; i++) { System.out.println(name + "运行 count= " + count--); try { sleep((int) Math.random() * 10); } catch (InterruptedException e) { e.printStackTrace(); } } } } public class Main { public static void main(String[] args) { Thread1 mTh1=new Thread1("A"); Thread1 mTh2=new Thread1("B"); mTh1.start(); mTh2.start(); } }
二、实现Runnable的demo
/** *多线程学习 实现runnable,资源能共享 *@author */ package com.multithread.runnable; class Thread2 implements Runnable{ private int count=15; @Override public void run() { for (int i = 0; i < 5; i++) { System.out.println(Thread.currentThread().getName() + "运行 count= " + count--); try { Thread.sleep((int) Math.random() * 10); } catch (InterruptedException e) { e.printStackTrace(); } } } } public class Main { public static void main(String[] args) { Thread2 mTh = new Thread2(); new Thread(mTh, "C").start();//同一个mTh,可是在Thread中就不能够,若是用同一个实例化对象mt,就会出现异常 new Thread(mTh, "D").start(); new Thread(mTh, "E").start(); } }
//这里要注意每一个线程都是用同一个实例化对象,若是不是同一个,效果就和上面的同样了!
提醒一下你们:main方法其实也是一个线程。在java中全部的线程都是同时启动的,至于何时,哪一个先执行,彻底看谁先获得CPU的资源。spa
在java中,每次程序运行至少启动2个线程。一个是main线程,一个是垃圾收集线程。由于每当使用java命令执行一个类的时候,实际上都会启动一个jvm,每个jvm实际上就是在操做系统中启动了一个进程。操作系统