Java面向对象:线程与进程+Thread类实现多线程

在Java语言之中最大的语言特点是支持多线程的编程语言,如果不能对多线程对全面细致的了解,那么在日后的程序设计之中,尤其是并发访问的设计之中就会出现严重的技术缺陷。

进程与线程

在传统的DOS系统的时代,其电脑上有一个特点:如果电脑出现了病毒,那么所有的程序将无法执行,因为传统的DOS采用的是单进程处理,而单进程处理的最大特点:在同一时间段上只允许一个程序在执行。
那么后来Windows时代开启了多进程的设计,于是就表示在一个时间段上可以运行多个程序,并且这些程序将进行资源的轮流抢占,所以在同一个时间段上就会有多个程序依次执行,但是在同一个时间点上只会有一个程序执行,但是在多核CPU,由于可以处理的CPU多了,那么即便有再多的进程出现,也可以比单核CPU处理的速度有所提升。

线程是在进程的基础之上划分的更小的程序单元,线程是在进程基础上创建并使用的,所以线程以来与进程的支持,但是线程的启动速度要比进程快许多,当使用多线程进行并发处理的时候,其执行性能要高于进程。
Java是多线程的编程语言,所以Java在进行并发访问处理的时候可以得到更高的处理性能。

Thread类实现多线程

如果想要在Java之中实验多线程的定义,那么就需要有一个专门的线程主体类进行线程的执行任务的定义,而这个主体类的定义是有要求的,必须实现特定的接口或者继承特定的父类才可以完成。
继承Thread类实现多线程:
Java里面提供有一个java.lang.Thread的程序类,那么一个类只要继承了此类就表示这个类为线程的主体类,但是这并不能说明这个类就可以直接实现多线程的处理了,因为还需要覆写Thread类中提供的一个run()方法(public void run() ),而这个方法就属于线程的主方法。

范例:多线程主题类

public class ToThread extends Thread{
    int d;
    public ToThread(String name,int a)
    {
        super(name);
        this.d=a;
    }
    @Override
    public void run()
    {
        for(int i=d;i<50;i+=2)
        {
            System.out.print(" "+i);
        }
        System.out.println(getName()+"结束");
    }
}

多线程要执行的功能都应该在run()方法中进行定义。需要说明的是:在正常情况下,如果想要使用类中的方法,那么肯定要产生实例化对象,而后去调用类中提供的方法,但是run()方法是不能被直接调用的,因为这里面牵扯到一个操作系统的资源调度问题,所以要想启动多线程,必须使用start()方法完成。
范例:多线程启动

class MyThread extends Thread{
    private String name;
    MyThread(String name)
    {
        this.name =name;
    }
    @Override
    public void run()
    {
        for(int i=0;i<10;i++)
        {
            System.out.println(this.name+" 运行 x="+i);
        }
    }
}

/**
 * @author 师大叶子鹏
 */
public class TestDemo {
    public static void main(String [] args)
    {
        new MyThread("线程A").run();//使用run时
        new MyThread("线程B").run();
        new MyThread("线程C").run();
    }
}

在这里插入图片描述
此时没有start()进行多线程的启动。

		new MyThread("线程A").start();
        new MyThread("线程B").start();
        new MyThread("线程C").start();

当把代码进行更改时
在这里插入图片描述
于是线程的不确定性就显现出来。
通过此时的调用,可以发现,虽然是调用的是start()方法,但是最终执行的 是run()方法,并且所有线程对象都是交替执行的。

public synchronized void start() {
        if (threadStatus != 0) //判断线程的状态
            throw new IllegalThreadStateException();  //抛出了一个异常,该异常是RunTimeException的子类,每一个线程类的对象只允许启动一次,如果重复启动则就抛出此异常
        group.add(this);

        boolean started = false;
        try {
            start0();//在start方法里面调用了start0,只定义了方法名称但是没有实现。
            started = true;
        } finally {
            try {
                if (!started) {
                    group.threadStartFailed(this);
                }
            } catch (Throwable ignore) {
            }
        }
    }

    private native void start0();
    

在java程序执行的过程中考虑到对于不同层次开发者的需求,所以其支持有本地的操作系统函数调用,而这项技术被称作JNI(JavaNative Inteface)技术,但是java开发过程中不推荐这样使用。利用这项技术可以使用一些操作系统提供的底层函数进行一些特殊的处理,而在Thread类里面提供的start0()就表示需要将此方法依赖于不同的操作系统实现。
在这里插入图片描述

任何情况下,只要定义了多线程,多线程的启动永远只有一种方案:Thread类中的start()方法。
posted @ 2020-11-17 20:52  Zeker62  阅读(57)  评论(0编辑  收藏  举报