1. Java内存管理面试指南一
  2. Java基础面试指南一
  3. Java基础面试指南二
  4. Java基础面试指南三
  5. Java基础面试指南四
  6. Java线程面试指南一
  7. Java线程面试指南二
  8. Redis面试指南一
  9. Kafka面试指南一
  10. Spring面试指南一
  11. SpringBoot面试指南一
  12. 微服务面试指南一

Java支持单线程以及多线程操作。线程是程序的执行路径。今天编写的大多数程序都是作为单线程运行的,当需要同时发生多个事件或动作时会引起问题。单线程程序具有一个入口点(main()方法)和一个出口点。

可以使用两种不同的机制来创建线程:

扩展Thread类

实现Runnable接口

Java中的线程是什么?
  • 线程以最佳方式消耗CPU,因此可以进行多处理。多线程减少了CPU的空闲时间,从而提高了应用程序的性能。
  • 线程是轻量级的过程。
  • 线程类属于java.lang包。
  • 即使我们不创建任何线程,我们也可以在Java中创建多个线程,至少一个线程确实存在,即主线程。
  • 多个线程在Java中并行运行。
  • 线程有自己的堆栈。
  • 线程的优点:假设一个线程需要10分钟才能完成某些任务,一次使用10个线程可以在1分钟内完成该任务,因为线程可以并行运行。
Java中的Process和Thread有什么区别?

一个进程可以有多个线程,

线程是进程的细分。一个或多个线程在进程的上下文中运行。线程可以执行过程的任何部分。进程的同一部分可以由多个线程执行。

进程具有其父进程的数据段的副本,而线程可以直接访问其进程的数据段。

进程具有自己的地址,而线程共享创建它的进程的地址空间。

流程创建需要完成很多工作,我们可能需要复制整个父流程,但是可以轻松创建线程。

进程可以轻松地与子进程进行通信,但是进程间的通信很困难。同时,线程可以使用wait()和notify()方法轻松地与同一进程的其他线程通信。

在处理过程中,所有线程共享系统资源(例如堆内存等),而线程具有其自己的堆栈。

对进程所做的任何更改都不会影响子进程,但是对线程所做的任何更改都可能影响该进程其他线程的行为。

查看在不同进程和相同进程上创建线程的位置的示例。

如何在Java中实现线程?

这是非常基本的线程问题。可以通过两种方法来创建线程:通过实现java.lang.Runnable接口或扩展java.lang.Thread类,然后扩展run方法。

线程有其自己的变量和方法,它在堆上生存和死亡。但是执行线程是具有自己的调用堆栈的单个进程。线程是Java中的轻量级进程。

通过实现java.lang.Runnable interface创建线程。

我们将创建实现Runnable接口的类的对象:

MyRunnable runnable=new MyRunnable();

Thread thread=new Thread(runnable);

然后通过调用构造函数并传递Runnable接口的引用(即runnable object)来创建Thread对象:

Thread thread=new Thread(runnable);
线程是否实现自己的堆栈,如果是,如何实现?

是的,线程有自己的堆栈。这是一个非常有趣的问题,面试官倾向于检查您有关线程如何内部维护自己的堆栈的基本知识。

我们应该实现Runnable接口或扩展Thread类。实现Runnable和扩展Thread有什么区别?

很好的答案是,只有在您想要修改run()和其他方法时,才必须扩展Thread。如果只想修改实现Runnable的run()方法是最好的选择(Runnable接口只有一个抽象方法,即run())。

实现Runnable接口和扩展Thread类之间有什么区别?

java中不允许多重继承:当我们实现Runnable接口时,我们也可以扩展另一个类,但是如果我们扩展Thread类,则不能扩展任何其他类,因为Java不允许多重继承。因此,通过实现Runnable和扩展Thread可以完成相同的工作,但是在实现Runnable的情况下,我们仍然可以选择扩展其他类。因此,最好实现Runnable。

  • 线程安全性:当我们实现Runnable接口时,同一对象在多个线程之间共享,但是当我们扩展Thread类时,每个线程都与新对象相关联。
  • 继承(实现Runnable是轻量级操作):当我们不必要地扩展Thread时,所有Thread类的功能都会被继承,但是当我们实现Runnable接口时,不会继承任何额外的功能,因为Runnable仅包含一个抽象方法,即run()方法。因此,实现Runnable是轻量级的操作。
  • 编码到接口:甚至java也建议编码到接口。因此,我们必须实现Runnable而不是扩展线程。另外,Thread类实现Runnable接口。
  • 除非要修改类的基本行为,否则不要扩展,Runnable接口只有一个抽象方法,即run():仅当您希望修改run()和其他方法时,才必须扩展Thread。如果只想修改实现Runnable的run()方法是最好的选择(Runnable接口只有一个抽象方法,即run())。除非我们要修改Thread类的基本行为,否则我们不能扩展Thread类。
  • 实现Runnable时代码的灵活性:当我们首先扩展Thread时,所有线程功能都被继承,并且我们的类成为Thread的直接子类,因此我们正在做的任何操作都在Thread类中。但是,当我们实现Runnable时,我们创建了一个新线程并将runnable对象作为参数传递,我们可以将runable对象传递给执行程序Service等等。因此,当我们实现Runnable时,我们有更多选择,并且代码变得更加灵活。
  • Executor Service:如果我们实现Runnable,则可以使用Executor Service启动在可运行对象上创建的多个线程(因为我们可以使用新线程来启动Runnable对象),但是在扩展Thread的情况下则不会(因为线程只能启动一次) 。
怎么说线程的行为是不可预测的?

问题的解决方案非常简单,线程行为是不可预测的,因为线程的执行取决于线程调度程序,线程调度程序在Windows,Unix等不同平台上的实现方式可能不同。即使在同一平台上,相同的线程程序在后续执行中也可能产生不同的输出。

为了实现这一点,我们将在同一个Runnable对象上创建2个线程,在run()方法中创建for循环并启动两个线程。不能确定哪个线程将首先完成,两个线程都将在for循环中匿名输入。

当线程不是Java中的轻量级进程时?

仅当同一进程的线程同时执行时,线程才是轻量级进程。但是,如果不同进程的线程同时执行,那么线程就是重量级进程。

如何确保从main开始的所有线程必须按它们开始的顺序结束,并且main应该最后结束?

面试官倾向于了解面试者对Thread方法的了解。因此,现在该通过正确回答来证明您的观点了。我们可以使用join()方法来确保所有从main开始的线程必须按照它们开始的顺序结束,并且main也应该在最后结束。换句话说,等待该线程死亡。内部调用join()方法将调用join(0);

详细说明:Join()方法–确保从main开始的所有线程必须按它们开始的顺序结束,并且main也应最后结束。具有程序的join()方法的类型-join的10个显着特征。

使用run()和start()方法启动线程之间的区别是什么?

这是一个非常有趣的问题,它可能会使您感到困惑,并且有时可能使您认为使用run()和start()方法启动线程之间确实存在任何区别。

当您调用start()方法时,主线程在内部调用run()方法以启动新创建的线程,因此run()方法最终被新创建的线程调用。

当您调用run()方法主线程而不是使用新线程启动run()方法,它将自行启动run()方法。

使用Volatile关键字有什么意义?

Java允许线程访问共享变量。通常,为确保一致地更新共享变量,线程应通过获取对这些共享变量强制执行互斥的锁来确保其专有使用此类变量。

如果将字段声明为易失性,则在这种情况下,Java内存模型可确保所有线程看到的变量值均一致。

[不得不知道系列]Java线程面试你不得不知道的基础知识一的更多相关文章

  1. Kafka面试你不得不知道的基础知识

    Java内存管理面试指南一 Java基础面试指南一 Java基础面试指南二 Java基础面试指南三 Java基础面试指南四 Java线程面试指南一 Java线程面试指南二 Redis面试指南一 Kaf ...

  2. Java并发编程(您不知道的线程池操作)

    Java并发编程(您不知道的线程池操作) 这几篇博客,一直在谈线程,设想一下这个场景,如果并发的线程很多,然而每个线程如果执行的时间很多的话,这样的话,就会大量的降低系统的效率.这时候就可以采用线程池 ...

  3. Java并发编程(您不知道的线程池操作), 最受欢迎的 8 位 Java 大师,Java并发包中的同步队列SynchronousQueue实现原理

    Java_并发编程培训 java并发程序设计教程 JUC Exchanger 一.概述 Exchanger 可以在对中对元素进行配对和交换的线程的同步点.每个线程将条目上的某个方法呈现给 exchan ...

  4. 第一篇:微信公众平台开发实战Java版之了解微信公众平台基础知识以及资料准备

    相信很多人或多或少听说了微信公众平台的火热.但是开发还是有一点门槛,鉴于挺多朋友问我怎么开发,问多了,自己平时也进行以下总结.所以下面给大家分享一下我的经验: 微信公众号是什么? 官网的介绍:再小的个 ...

  5. Java学习-033-JavaWeb_002 -- 网页标记语言JSP基础知识

    JSP 是 Sun 公司提倡的一门网页技术标准.在 HTML 文件中,加入 Java 代码就构成了 JSP 网页,当 Web 服务器访问 JSP 请求的时候,首先执行其中的 Java 程序源码,然后以 ...

  6. java线程面试

    1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速.比如,如果一个线程完成 ...

  7. Java岗 面试考点精讲(基础篇02期)

    1. 两个对象的hashCode相同,则equals也一定为true,对吗? 不对,答案见下面的代码: @Override public int hashCode() { return 1; } 两个 ...

  8. 【Java并发】1. Java线程内存模型JMM及volatile相关知识

    Java招聘知识合集:https://www.cnblogs.com/spzmmd/tag/Java招聘知识合集/ 该系列用于汇集Java招聘需要的知识点 JMM 并发编程的三大特性:可见性(vola ...

  9. Java 网络编程(一) 网络基础知识

    链接地址:http://www.cnblogs.com/mengdd/archive/2013/03/09/2951826.html 网络基础知识 网络编程的目的:直接或间接地通过网络协议与其他计算机 ...

随机推荐

  1. JAVA编程思想 Ch3.5题

    练习5:创建一个class类,包含连两个String字段 :name.says.在main方法中创建两个Dog方法 一个命名为spot 叫声为 Ruff,另一个命民为scruffy,叫声为:Wuff: ...

  2. Vim Operations

    Vim有三种模式:输入模式.命令模式和末行命令模式. 输入模式用来输入文字,命令模式用来下达编排文件的操作指令,末行命令模式用来进行文件存档.离开编辑器等操作. 进入及离开 末行模式下: :w 保存当 ...

  3. XML--XML作用

    XML 把数据从 HTML 分离 如果你需要在 HTML 文档中显示动态数据,那么每当数据改变时将花费大量的时间来编辑 HTML. 通过 XML,数据能够存储在独立的 XML 文件中.这样你就可以专注 ...

  4. 2019 ICPC 银川网络赛 D. Take Your Seat (疯子坐飞机问题)

    Duha decided to have a trip to Singapore by plane. The airplane had nn seats numbered from 11 to nn, ...

  5. C :uthash

    参考: [1] uthash | 学步园 [2] 源码 [3] 官方文档 [4] [5] 一.哈希表的概念及作用 在一般的线性表或者树中,我们所储存的值写它的存储位置的关系是随机的.因此,在查找过程中 ...

  6. 题目分享C 二代目

    题意:一个数列是由 1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 1 2 3 4 5 6.....组成,也就是1-1,1-2,1-3......并且如果遇到多位数也要拆成数字比如1-10 ...

  7. dp cf 20190614

    C. Hard problem 这个题目一开始看还感觉比较复杂,但是还是可以写,因为这个决策很简单就是对于这个字符串倒置还是不倒置. 然后我不会一维去转移,直接用二维,第二维用01来表示转移和不转移, ...

  8. SpringBoot:整合Shiro

    目录 1.Shiro简介 1.1.什么是Shiro? 1.2.有哪些功能 1.3.Shiro架构(外部) 1.4.Shiro架构(内部) 2.HelloWorld 3.Shiro整合Spring Bo ...

  9. vue将后台的值赋给前台

    后台传List到前台: 赋值给table 赋值给form(只能一个个的赋值,对应prop属性) 后台传map到前台:(不需要使用下标取值)

  10. matlab基础知识总结