Java 多线程编程--创建线程的两种方式

519 阅读4分钟

进程与线程

进程:进程是一个程序运行的过程,是系统进行资源分配和调度的独立单位

线程:是进程中的实际运行单位,CPU调度的基本单位

一个进程在运行时,至少有一个线程在运行,这个线程成为主线程,一般情况下,主线程结束,子线程也会立即结束。

Java多线程

Java的多线程一般与Thread类有关,有两种方式可以实现Java的多线程:

1.继承Thread类

2.继承Runnable接口

Thread类

先来看通过Thread类实现的多线程示例:

MyThrea.java
public class MyThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {
            System.out.println(Thread.currentThread().getName()+":"+i);
        }
    }
}
------------------------------------
Main.java
public class Main {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.setName("myThread");
        myThread.start();
        for(int i=0;i<1000;i++){
            System.out.println(Thread.currentThread().getName()+":"+i);
        }
    }
}

Thread.currentThread().getName()是获得调用getName()方法的线程名。

MyThread类,它继承自Thread类,同时重写了run()方法。run()方法的作用就是指定线程的具体工作内容,在这里是从0打印到1000

Main类,它创建一个MyThread类的实例,指定线程名字为MyThread。然后调用start()方法。start()方法的作用是开启一个新的线程并调用run()方法,此处就是myThread实例的run()方法。然后从0打印到1000

输出:
...(前面部分省略)
main:128
main:129
main:130
main:131
main:132
MyThread:71
MyThread:72
MyThread:73
main:133
main:134
MyThread:74
MyThread:75
MyThread:76
main:135
MyThread:77
MyThread:78
MyThread:79
main:136
MyThread:80
...(后面部分省略)

在该示例中,如果整个过程只有一个线程,那么MyThread的输出应该是到1000才开始输出main,但从上可以看到main和MyThread交替输出,所以整个过程有两个线程。

同时该示例,每一次运行都可能得到不同的输出结果,因为当MyThread线程开启后,便和main线程开始竞争CPU资源,如果是main先抢到CPU资源,那么main先输出;如果是MyThread先抢到CPU资源,那么MyThread先输出。在获得的CPU时间内,如果线程没有执行完当前的任务,那么会让出CPU,再次参与资源竞争。

Runnable接口

Java对象仅支持单继承,如果想要创建已经有一个父类的线程类,那么就不能再继承自Thread类,此时可以通过实现Runnable接口。 示例:

MyThread.java
public class MyThread implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {
            System.out.println(Thread.currentThread().getName() + ":" + i);
        }
    }
}
------------------------------------
Main.java
public class Main {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        Thread thread = new Thread(myThread, "MyThread");
        thread.start();
        for(int i=0;i<1000;i++){
            System.out.println(Thread.currentThread().getName()+":"+i);
        }
    }
}

Thread.currentThread().getName()是获得调用getName()方法的线程名。

MyThread类,它实现Runnable接口,重写了run()方法。run()方法的作用就是指定线程的具体工作内容,在这里是从0打印到1000

Main类,它创建一个MyThread类的实例,指定线程名字为MyThread。然后以Thread类的构造函数创建一个Thread实例,设置线程名字为myThread。然后调用start()方法。start()方法的作用是开启一个新的线程并调用run()方法,此处就是myThread实例的run()方法。接着从0打印到1000

其运行结果与继承Thread类实例运行结果类似。

在Thread类中有以下几个构造方法:

Thread()

Thread(Runnable target)

Thread(Runnable target, String name)   (该方法为实例调用的构造方法)

Thread(String name)

Thread(ThreadGroup group, Runnable target)

Thread(ThreadGroup group, Runnable target, String name)

Thread(ThreadGroup group, Runnable target, String name, long stackSize)

Thread(ThreadGroup group, String name)

在这8个构造函数中,有两个Thread(Runnable target)和Thread(Runnable target, String name),可以传递Runnable接口,说明支持传入一个Runnable接口的对象

使用继承Thread类的方式开发多线程应用程序在设计上是有局限性的,因为Java是单继承。使用实现Runnable接口的方式便可打破这种限制。

另外说明Thread.java类也实现了Runnable接口(可以在源码中看到实现Runnable接口),意味着构造函数Thread(Runnable target)可以传入任何一个实现了Runnable接口的对象,包括Thread类对象,这样做完全可以将一个Thread对象中的run()方法交由其他的线程进行调用

Java多线程的创建就讲到这里,我参考了<Java 多线程编程 核心技术 高鸿岩著>这本书籍

有任何问题、意见请在下面留言或者邮箱联系-310103270@qq.com