一、概述
1、实现方式
在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方法?源码
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();