一、概述

1、实现方式

  002-多线程-基础-实现方式【thread、runnable、callale、thread和runnable对比】

  在java中对于多线程实现一定要有一个线程的主类,而这个线程的主类往往是需要操作一些资源,但是对于多线程主类的实现是:
  主要是继承Thread父类,Thread内实现了Runnable接口

    从java的Thread类继承实现多线程,也是实现其run方法,然后声明实例,并调用实例的start方法启动线程。

    实现Runnable接口(Callable接口)

      使用Runnable接口实现多线程需要两个步骤,首先实现Runnable接口类,然后声明Thread实例,调用thread实例的start方法,开始执行。

       run接口及模板方法设计模式的标准体现。

2、java Thread类的主要方法介绍 

Thread的实例方法:

方法定义

方法说明

public void start()

最常用的方法,顾名思义启动线程,即开始执行线程的run方法

public void run()

如果线程重写了run方法,那么执行重写的方法,否则执行线程的Runnable接口中定义的run

public final void setName(String)

设置线程的名称,不指定:Thread-数字

    public Thread() {
        init(null, null, "Thread-" + nextThreadNum(), 0);
    }

public final void setPriority(int)

设置线程的优先级(范围在1-10包含1,10)

public final void setDeamon(boolean)

设置线程是否是后台线程

public final void join(long)

在另外一个线程中调用当前线程的join方法,会导致当前线程阻塞,直到另一线程执行完毕,或者超过参数指定毫秒数

public void interrupt()

中断线程

public final boolean isAlive()

线程是否处于存活状态,线程在启动和结束之前都处于存活状态

 Thread类的常用静态方法:

方法定义

方法说明

public static void yield()

使当前运行线程相同优先级的线程获得执行机会,类似sleep,但是只会将cpu让给相同优先级的线程

public static void sleep(long)

使当前线程休眠指定毫秒的时间

public static boolean holdsLock(Object x)

判断当前线程是否拥有对象的锁

public static Thread currentThread()

获得当前线程实例

public static void dumpStack()

打印当前线程的执行堆栈,这对多线程程序的调试很有帮助

 

二、继承Thread类

java.lang.Thread,子类继承Thread,之后覆写run方法,线程主方法

class MyThread extends Thread {
    private String name;
    public MyThread(String name) {
        this.name = name;
    }
    @Override
    public void run() {// 主方法
        for (int i = 0; i < 10; i++) {
            System.out.println(this.name + " i:" + i);
        }
    }
}

  需要注意,所有线程都是并发执行,在某个时间段上会有多个线程交替执行。所以为了达到这样的目的,绝对不能够直接调用run方法,而是调用线程对象中的start方法

        MyThread mt1 = new MyThread("线程A");
        MyThread mt2 = new MyThread("线程B");
        MyThread mt3 = new MyThread("线程C");
        //mt1.run()  此时 就是方法调用顺序执行
        mt1.start();
        mt2.start();
        mt3.start();

思考?为什么多线程启动不用run,而用start方法?源码

002-多线程-基础-实现方式【thread、runnable、callale、thread和runnable对比】
    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) {
            }
        }
    }
    private native void start0();
View Code

相关文章: