JavaJava多线程(1)——创建与启动

Java|多线程(1)——线程的创建与启动

一 引入

​ 有过操作系统基础的同学都应了解进程及线程。那么对于萌新们来说,简单来讲,进程就是应用程序运行的载体,每一个进程在执行时都有自己独立的内存空间,在我们执行一个应用程序时,它可以同时启动多个进程,例如我们在pc端qq聊天时,每打开一个聊天界面就相当于启动了一个新的进程。对于Java程序来说,我们在执行它时,就启动了一个独立的Java虚拟机进程,这个进程的任务就是解析并执行Java程序代码。

​ 而对于线程,它是指一个进程中的执行流程,一个进程中可以由多个线程组成,也就是说,一个进程中可以同时运行多个线程,分别用来执行不同的任务。

​ 在简单了解完进程及线程的概念后,本文将正式开始对于Java多线程系列的讲解,首先Java多线程的运行机制大家有兴趣可以自行了解,本系列文章将从线程的创建与启动开始。

二、方法详解

​ 在Java中,当我们执行程序时,Java虚拟机会创建一个主线程,该线程从程序入口main()方法开始执行。那么,当我们为了提高程序资源利用率、程序响应性等参数时,用户可以自行创建自己的线程,它将与主线程并发运行。其中,创建线程有两种方式:

  • 扩展java.lang.Thread类

  • 实现Runnable接口

    接下来,本文将详细讲解此两种方式对于线程创建及启动的方法。

2.1 扩展java.lang.Thread类

​ Thread类表示线程类,它的最主要的方法有两个:

  • run():包含线程运行的所执行的代码

  • start():用于启动线程

    用户的线程类只需继承Thread类,覆盖Thread类的run()方法,在Thread类中,run()方法的定义如下:

public void run()

​ 当运行Java程序时,Java虚拟机线创建并启动主线程,主线程的任务是执行main()方法,当main()方法创建了一个线程子类对象时,会调用此对象的start()方法启动此线程,而此对象的任务是执行它的run()方法。

​ 接下来,本文将列举一个实例来进行此方式的深层理解,程序如下:

package threaddemo;

public class thredtest extends Thread {
    @Override
    public void run() {
        for(int a=0;a<50;a++){
            System.out.println(currentThread().getName()+":"+a);
            try{
                sleep(100);
            }
            catch(InterruptedException e){
                throw new RuntimeException(e);
            }
        }
    }

    public static void main(String[] args) {
        thredtest test1=new thredtest();
        thredtest test2=new thredtest();
        test1.start();
        test2.start();
        test1.run();
    }
}

​ 当主线程执行main()方法,会创建两个thredtest对象,然后启动两个thredtest线程,接着主线程开始执行第一个thredtest对象的run()方法,在Java虚拟机中,有3个线程并发执行thredtest对象的run()方法。在三个线程的方法栈中均有run()方法位于其栈帧,而在这个帧中均有各自的局部变量a来进行递增输出,它们都各自从0到50。因此,最终的输出结果的一种可能是:

main:0
Thread-0:0
Thread-1:0
...
Thread-1:49
Thread-0:49
main:49
2.2 实现Runnable接口

​ 我们都知道,对于Java,其不允许一个类继承多个类,因此一旦一个类继承Thread类,就不能再继承其他的类,为了解决这个弊端,Java提供了Runnable接口,它有一个run()方法,定义如下:

public void run()

​ 下面再结合实例来进行理解,程序思路与上述思路一致,但采用“实现Runnable接口”的方法来进行代码实现,具体代码如下:

package threaddemo;

import static java.lang.Thread.currentThread;
import static java.lang.Thread.sleep;

public class runnabletest implements Runnable{
    //int a;
    @Override
    public void run() {
        for(int a=0;a<50;a++){
            System.out.println(currentThread().getName()+":"+a);
            try{
                sleep(100);
            }catch (InterruptedException e){
                throw new RuntimeException(e);
            }
        }
    }

    public static void main(String[] args) {
        runnabletest runnable=new runnabletest();
        Thread thread1=new Thread(runnable);
        Thread thread2=new Thread(runnable);java
        thread1.start();
        thread2.start();
        runnable.run();
    }
}

​ 因此,最终的输出结果的一种可能是:

main:0
Thread-0:0
Thread-1:0
...
Thread-1:49
Thread-0:49
main:49

​ 综上,本文主要介绍了两种线程创建和启动的方式——1、扩展java.lang.Thread类;2、实现Runnable接口,总的来说,两种接口对于用户自定义线程的创建和启动各有利弊,具体使用规范还需在实践中进行摸索。

三、总结

​ Java多线程开发对于程序开发具有资源利用率更好;程序设计在某些情况下更简单;程序响应更快等优势,而接下来一文笔者也将介绍线程的状态转换,大家敬请期待!由于小编水平有限,讲不到的地方,还请读者们自行补充,若文中理论或者代码有错误,希望大家及时联系小编进行修正,谢谢大家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值