写点什么

Java 面试之多线程:Java 创建多线程为什么只有一种方式?

用户头像
极客good
关注
发布于: 刚刚

这是在调用 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 类中就完


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


成了实现多线程的目的。我们先留意一点,实现 Runnable,其核心在于哪里?在于我们可以将这个实现类的实例作为方法参数传递到 Thread 类中来执行。那么,我想问你的是,它本身是一个线程吗?不是吧,对吧,如果接口实现类本身是一个线程,我们前面刚刚介绍的,启动线程直接调用 start 方法不就可以了吗,你看看 Runnable 接口实现类有这个方法吗?



答案是肯定没有的,因为 Runnable 中没有这个方法,这个方法是来自于 Thread 类才独有的。

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
Java面试之多线程:Java创建多线程为什么只有一种方式?