进程是程序的一次动态的执行过程,它经历了从代码加载、执行完毕的一个完整过程,这个过程也是进程本身从产生、发展到最终消亡的过程。
多线程是实现并发机制的一种有效的手段。进程和线程一样,都是实现并发的一个基本单位。
如果现在同时运行多个任务,则所有的系统资源将是共享的,补所有线程所公用,但是程序处理需要CPU,传统的单核CPU来说 ,在同一个时间段上会有多个程序执行,但是在同一个时间点上只能存在一个程序运行,也就是说,所有的程序都要抢占CPU资源。
但是现在的CPU已经发展到多核状态了,在一个电脑上可能会存在多个CPU,那么这个时候就可以非常清楚的发现多线程操作间是如何并发执行的,那么本机的CPU是双核的。
JAVA的多线程实现
两种方式实现多线程:
1)继承Thread类
2)实现Runnable接口
继承Thread类
Thread类是在java.lang包中定义的,一个类只要继承了Thread类,此类就称为多线程操作类。在Thread子类之中,必须明确的复写Thread类中的run()方法,此方法为线程的主体。
class 类名称 extends Thread{ 属性...; 方法...; //复写Thread类中的run()方法,此方法为线程主体 public void run(){ 线程主体; } }
java.lang 包含在程序运行时自动导入,所以无需手工编写import语句。
一个类继承了Thread类之后,那么此类就具备了多线程的操作功能。
class Mythread1 extends Thread{ private String name; public Mythread1(String name){ this.name=name; } public void run(){ for(int i=0; i<10;i++){ System.out.println(name + "运行,i="+i); } } }
启动线程必须使用Thread类中定义的start()方法,一旦调用start()方法,实际最终调用的是run()方法。
class Mythread1 extends Thread{ private String name; public Mythread1(String name){ this.name=name; } public void run(){ for(int i=0; i<10;i++){ System.out.println(name + "运行,i="+i); } } } public class Mythread { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Mythread1 mt1=new Mythread1("线程A"); Mythread1 mt2=new Mythread1("线程B"); mt1.start(); mt2.start(); } }
同一个对象多次调用start()方法,会抛出:IllegalThreadStateException
- 如果线程已经启动。
实现Runnable接口
class Mythread1 implements Runnable { private String name; public Mythread1(String name){ this.name=name; } public void run(){ for(int i=0; i<10;i++){ System.out.println(name + "运行,i="+i); } } } public class MyThread { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Mythread1 mt1=new Mythread1("线程A"); new Thread(mt1).start(); } }
两种实现方式的区别
对于Thread类和Runnable接口本身都是可以进行多线程的实现,那么两都到底使用区别。
1)继承局限:使用Runnable接口可以避免单继承的局限,而Thread类有此局限。
2)资源共享:使用Runnable接口可以实现多线程资源的共享,而Thread类却无法实现。
Thread 类定义 :public class Thread extends Object implements Runnable
发现Thread类实际上是Runnable的子类。而且Thread类也要去接收Runnable其他子类对象,而且所有的线程中,通过Runnable接口实现的线程类里面都是编写的具体功能,而并没有所谓的CPU调度,而真正意义的CPU调度由操作系统完成(通过Thread类的start()方法调用的)。
Thread类要去协调操作系统,并且最终还要执行具体的纯种主体的方法,而线程的主体呢,现在只专著于具体的功能实现,至于如何调度根本不管。