Java 多线程(一) 线程的创建

来源:互联网 发布:javascript脚本语言 编辑:程序博客网 时间:2024/04/20 16:45

现代操作系统中,进程是资源分配的基本单位,而线程是调度的基本单位。一个进程内可以有多个线程,而这些线程可以共享进程的资源,比如内存资源,IO资源。 大家开发常用的Eclipse启动后就是一个进程,而使用它的不同功能会启动对应不同的线程,如代码编辑版块是一个线程在处理,视图(按钮,鼠标点击等)响应是另一个线程在处理。多线程提升了处理器的使用效率,因为在一个线程空闲时,处理器可以调用其他线程,宏观上来看,一个时间段内,有多个任务同时在执行,称为并发。

想象我们是一个武侠世界中的男主角,要完成的任务的有练功,研读武功秘籍,吃饭。武功秘籍厚厚一本,如果只能单任务顺序处理,读完秘籍再练功,再吃饭,也许就饿死了。在多任务并发执行的情况下,我们为每个人物启动一个线程,可以看一会秘籍,然后练功,饿了就吃饭,吃了饭之后再继续看书,练功。在读完秘籍的过程中,穿插了练功和吃饭。

      JDK提供了对多线程的支持,本文介绍JAVA中线程如何创建。

      1.通过继承Thread类创建线程

     我们建立一个练功的线程。

public class Practise extends Thread{public Practise(String name) {super(name);}//线程执行时调用此方法@Overridepublic void run() { System.out.println("Thread:"+Thread.currentThread().getName()+" is running");}public static void main(String[] args) {//新建MyThread实例,传入给线程起的名字 Practise practise = new Practise("Practise");                 practise.start();//启动线程}         }


Thread类时JDK提供的实现线程相关操作的类,我们要创建自己的线程类Hero,只需要继承Thread类,然后实现run方法,最后调用Hero实例的start方法,即启动了线程。线程想要做的事,编写在run方法里,线程在启动后,会自己执行run方法。上述代码的run方法输出正在调用该方法的线程名称。我们新建Hero实例时,传入了一个String,这是在定义该线程的名称,在run方法中,我们通过
Thread.currentThread().getName()
就可以输出定义的线程名称。

上述代码执行结果为

Thread:Practise is running

这里要注意,我们要通过practise.start()启动线程后,run方法才是被我们新建的practise线程调用,使用practise.run()只是调用run方法,并没有启动一个新的线程。
public class Practise extends Thread{public Practise(String name) {super(name);}//线程执行时调用此方法@Overridepublic void run() { System.out.println("Thread:"+Thread.currentThread().getName()+" is running");}public static void main(String[] args) {//新建MyThread实例,传入给线程起的名字Practise practise = new Practise("Practise");//practise.start();//启动线程practise.run();}}输出:Thread:main is running

我们换成直接在main方法里执行practise.run().输出结果:Thread:main is running. 线程名跟之前的不一样了,说明调用run方法的线程变成了main线程,而不是practise线程。main线程是调用main方法的线程。

2.通过实现runnable接口创建线程

上述介绍的通过继承Thread类来创建线程,有一定的局限性,因为Java不支持多继承,所以如果一个类已经继承过其他类,则无法通过继承Thread类来创建线程。Java提供了Runnable接口,通过实现该接口,也可以创建线程。

public class Practise implements Runnable{@Overridepublic void run() {System.out.println("Thread:"+Thread.currentThread().getName()+" is running");}public static void main(String[] args) {// TODO Auto-generated method stubPractise practise = new Practise();                Thread t = new Thread(practise,"Practise");t.start();}}输出结果:Thread:Practise is running


如上述代码所示,输出结果与继承Thread类的结果相同。我们需要先实例化实现了Runnable接口的类,然后将其作为参数传给一个Thread的实例对象,最后通过Thread实例对象的start方法来启动线程。



0 0