Java 面试之多线程:Java 创建多线程为什么只有一种方式?
这是在调用 Start()方法之后的 Runnable 状态,你翻译一下,Runnable,是一个形容词,看看人家用词描述的严谨程度,描述状态名词使用形容词,也就是可运行的,注意是可运行的,运行了吗?没有!是说你有运行的资格,但是并没有运行!所以不是运行状态!
(3)BLOCKED 阻塞状态。
BLOCKED 是指受阻塞并且正在等待监视器锁的某一线程的线程状态。什么情况下会触发这个状态?最直接的 IO 操作,计算机中人机交互永远都离不开 Input 与 Output,IO 操作的时候,大概率会触发阻塞状态。最常见就是 qq 与微信同时启动,再开一个谷歌浏览器,这个时候你 Win+E 你看看你电脑卡不卡就完了,在代码中去理解就是,代码执行,阻塞发生,在该操作 return 之前,线程不会继续此线程下面的代码。或者是你调用了 Sleep()方法,这个是比较常见的一种阻塞。好了,这就是阻塞。
(4)WAITING 状态。
这个也有一些比较常见的场景,比如,线程因为调用了 Object.wait()或 Thread.join()而未运行,就会进入 WAITING 状态。
(5)TIMED_WAITING 状态。
具有指定等待时间的某一等待线程的线程状态。
(6)TERMINATED 状态。
线程被终止了或者是,注意,是或者是线程终止了。也就是终止状态。终止状态对应两种不同的情况,一种是自动终止,这是由操作系统所分配的时间片决定的,一种是强制终止,这是用户决定的。至于先终止哪一个需要根据时间片轮转定义以及优先级决定。
好了,知道这些基础知识后,我们就可以来分析一下,为什么 Java 创建多线程只有一种方式了。我们先看实现 Runnable 接口:
package com.sinsy.fntp.thread;
public class ThreadTest {
/**
fntp
@param args
*/
public static void main(String[] args) {
//创建第一个线程
Thread thread01_main = new Thread (new RunnableImplTest ());
System.out.println ("执行 thread01");
thread01_main.start ();
//创建第二个线程
Thread thread02_main = new Thread ();
System.out.println ("执行 thread02 线程");
thread02_main.start ();
}
}
class RunnableImplTest implements Runnable{
@Override
public void run() {
//实现 Runnable 接口必须也要重写方法 重写是指覆盖原方法
System.out.println ("我执行啦!");
//当前正在执行的是哪个 Java 类?查一下
asr ();
}
public void asr(){
System.out.println (Thread.currentThread ().getStackTrace ()[0].getClassName ());
}
}
首先我们说,第一种最常见的就是实现 Runnable 接口, 新建一个 Java 类实现 Runnable 接口,然后重写该接口的 run() 方法,之后只需要把这个实现了 接口并重写了 run() 方法的接口实现类的实例,也就是实现类的对象,作为方法参数传到 Thread 类中就完
成了实现多线程的目的。我们先留意一点,实现 Runnable,其核心在于哪里?在于我们可以将这个实现类的实例作为方法参数传递到 Thread 类中来执行。那么,我想问你的是,它本身是一个线程吗?不是吧,对吧,如果接口实现类本身是一个线程,我们前面刚刚介绍的,启动线程直接调用 start 方法不就可以了吗,你看看 Runnable 接口实现类有这个方法吗?
答案是肯定没有的,因为 Runnable 中没有这个方法,这个方法是来自于 Thread 类才独有的。
评论