java多线程

2019-04-10  本文已影响0人  王古

新建

new() ,Thread()进程的子类,start()

就绪

等待JVM线程调度器的调度

运行

获取CPU资源 run()

阻塞

sleep(),suspend(挂起)

priority(优先级)

创建线程

需要重写run(),同时也需要调用Thread的start()

public class MyRunnable implements Runnable {
    public void run() {
        // ...
    }
}

public static void main(String[] args) {
    MyRunnable instance = new MyRunnable();
    Thread thread = new Thread(instance);
    thread.start();
}

同样也是需要实现 run() 方法,因为 Thread 类也实现了 Runable 接口

public class MyThread extends Thread {
    public void run() {
        // ...
    }
}

public static void main(String[] args) {
    MyThread mt = new MyThread();
    mt.start();
}

Java 不支持多重继承,因此继承了 Thread 类就无法继承其它类,但是可以实现多个接口

类可能只要求可执行就行,继承整个 Thread 类开销过大。

互斥同步

java通过两种锁机制来控制多个线程对共享资源的互斥访问
JVM的synchronized
JDK的ReentranLock

Thread的几个重要方法。

wait()与sleep()的区别:

start()方法的调用后并不是立即执行多线程代码,而是使得该线程变为可运行态(Runnable),什么时候运行是由操作系统决定的。

阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:

notify(): 通知一个线程继续运行。

getID() : 获取线程的唯一标识

interrupt() : 停止线程,打一个停止的标记


Thread.currentThread().interrupted(); //中断程序
this.interrupted(); //是否已经中断,第一次调用之后状态标识便会被清除
this.isInterrupted(); //判断是否会中断,但是不会清除状态标识 

MyThread thread = new MyThread();
thread.start();
Thread.sleep();
thread.interrupt();

  1. stop() 暴力停止。可能会导致java.lang.ThreadDeath,已经过期了。
  2. 使用return停止线程
  1. yieID() 放弃当前的CPU资源,,给其他任务去占用,放弃时间不确定

线程优先级的继承特性

A线程启动B线程,则B线程的优先级与A相同

为什么我们要调用Thread中的start()时才执行run()方法,而不是直接调用run()

调用start方法方可启动线程使得线程进入就绪状态,而run方法只是Thread线程中的一个普通调用,还是在主线程里面执行的

上一篇下一篇

猜你喜欢

热点阅读