多线程

线程与进程

  • 线程是比进程更快的处理单元,而且所占用的资源也小,多线程的应用,也就是性能最高的应用(相比与进程而言)

总结

  • 线程的存在离不开进程。进程如果消失后,线程一定消失。线程消失后进程未必消失。

Java多线程实现

  • 掌握Java中三种多线程的实现方式(JDK1.5之后增加了第三种)

如何实现:

如果想在Java中实现多线程,有两种突击:

  • 继承Thread类:
  • 实现Runnable接口(Callable接口)

继承Thread类

Thread类是一个支持多线程的功能类,只要有一个子类他就可以实现多线程的支持

/**
 * 这是一个多线程的操作类
 */
class MyThread extends Thread{
    
}

Java中所有程序的“起点”是main()方法,但是在多线程也一定要有自己的起点,那么这个起点就是 run()也就是说,在多线程的每个主体类中都必须覆写Thread类提供的run()方法。

  • public void run(){}
    • 这个方法上没有返回值,那么也就是表示了线程一旦开始就要一直执行,不能够返回内容。

举例:

/**
 * 线程操作主类
 * 这是一个多线程的操作类
 */
class MyThread extends Thread{

    private String name; /* 定义类中属性 */
    public  MyThread(String name){ /* 定义构造方法 */
        this.name = name;
    }

    /**
     * 重写/覆写run()方法,作为线程的主体操作方法
     */
    @Override
    public void run() {
        for (int i = 0; i < 200; i++) {
            System.out.println(this.name+" -> " + i);
        }
    }
}

本线程类的功能是进行循环的输出操作,所有的线程与进程是一样的,都必须轮流的去抢占系统资源。也就是说,如果直接调用了run()方法,并不能启动多现象,应该使用Thread类中的start()方法

public class TestDemo {

    public static void main(String[] args) {
        MyThread m1 = new MyThread("线程A");
        MyThread m2 = new MyThread("线程B");
        MyThread m3 = new MyThread("线程C");
        
        m2.start();
        m1.start();
        m3.start();
    }
}

/**
 * 线程操作主类
 * 这是一个多线程的操作类
 */
class MyThread extends Thread{

    private String name; /* 定义类中属性 */
    public  MyThread(String name){ /* 定义构造方法 */
        this.name = name;
    }

    /**
     * 重写/覆写run()方法,作为线程的主体操作方法
     */
    @Override
    public void run() {
        for (int i = 0; i < 200; i++) {
            System.out.println(this.name+" -> " + i);
        }
    }
}

此时发现执行结果为线程对象交替执行。


多线程_第1张图片
执行结果

疑问?为什么多线程的启动不是调用的run() 而必须调用start()?

打开Java源码,我们来观察以下start()方法的定义

    public synchronized void start() {

        if (threadStatus != 0)
            throw new IllegalThreadStateException();

        group.add(this);

        boolean started = false;
        try {
            start0();
            started = true;
        } finally {
            try {
                if (!started) {
                    group.threadStartFailed(this);
                }
            } catch (Throwable ignore) {
                /*  */
            }
        }
    }

首先发现Thread类中start() 存在 IllegalThreadStateException异常抛出。

你可能感兴趣的:(多线程)