b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

多线程常见问题解答(访谈)

电脑杂谈  发布时间:2020-05-13 08:38:14  来源:网络整理

多线程避免死锁_线程死锁_避免线程死锁

多线程处理是面试官在Java技术面试中更愿意提出的问题之一. 这里,大多数重要问题都是从访谈的角度列出的,但是作为一名程序员,您仍然应该牢牢掌握Java多线程的基础知识,以应对将来遇到的问题.

Java程序员金三银四求职季,这些多线程面试题你会吗?

进程是独立的(独立的)运行环境,可以将其视为程序或应用程序. 线程是在流程中执行的任务. Java运行时环境是一个包含不同类和程序的单个进程. 线程可以称为轻量级进程. 线程需要较少的资源来创建和驻留在流程中,并且可以在流程中共享资源.

在多线程程序中,多个线程可以同时执行以提高程序效率,并且CPU不会进入空闲状态,因为一个线程需要等待资源. 堆内存由多个线程共享,因此创建多个线程来执行某些任务比创建多个进程更好. 例如,Servlet比CGI更好,因为Servlet支持多线程,而CGI不支持.

当我们在Java程序中创建线程时,它称为用户线程. 守护程序线程是在后台执行并且不会阻止JVM终止的线程. 当没有用户线程在运行时,JVM关闭程序并退出. 守护程序线程创建的子线程仍然是守护程序线程.

有两种创建线程的方法: 一种是实现Runnable接口,然后将其传递给Thread构造函数以创建Thread对象. 第二个是直接继承Thread类.

当我们在Java程序中创建新线程时,其状态为“新建”. 当我们调用线程的start()方法时,状态更改为Runnable. 线程调度程序将CPU时间分配给Runnable线程池中的线程,并将其状态更改为Running. 其他线程状态包括Waiting,Block和Dead.

当然,但是如果我们调用Thread的run()方法,它将像普通方法一样工作. 为了在新线程中执行代码,我们必须使用Thread.start()方法.

线程死锁_多线程避免死锁_避免线程死锁

我们可以使用Thread类的Sleep()方法将线程暂停一段时间. 应当注意,这不会导致线程终止. 一旦线程从睡眠中唤醒,线程的状态将更改为Runnable,并根据线程调度将其执行.

每个线程都有优先级. 一般而言,高优先级线程将在运行时具有优先级,但这取决于线程调度的实现. 此实现与操作系统(取决于OS)有关. 我们可以定义线程的优先级,但这不能保证高优先级的线程将在低优先级的线程之前执行. 线程优先级是一个int变量(从1到10),其中1表示最低优先级,10表示最高优先级.

线程调度程序是一项操作系统服务,负责为处于Runnable状态的线程分配CPU时间. 一旦创建线程并启动它,它的执行就取决于线程调度程序的实现. 时间分片是指将可用的CPU时间分配给可用的可运行线程的过程. 分配CPU时间可以基于线程优先级或线程等待的时间. 线程调度不受Java虚拟机的控制,因此,最好由应用程序控制线程调度(也就是说,不要让您的程序依赖线程的优先级).

上下文切换是存储和恢复CPU状态的过程,它使线程执行能够从中断点恢复执行. 上下文切换是多任务操作系统和多线程环境的基本功能.

我们可以使用Thread类的joint()方法确保程序创建的所有线程在main()方法退出之前结束.

Java程序员金三银四求职季,这些多线程面试题你会吗?

当线程可以共享资源时,线程间通信是协调它们的重要手段. Object类中的wait()notify()notifyAll()方法可用于关于资源锁状态的线程间通信.

Java中的每个对象都有一个锁(监视器,它也可以成为监视器),并且使用wait(),notify()和其他方法来等待对象的锁或通知其他线程对象该监视器是可用. Java线程中没有可用于任何对象的锁和同步器. 这就是为什么这些方法是Object类的一部分的原因,因此每个Java类都有一个用于线程间通信的基本方法

多线程避免死锁_线程死锁_避免线程死锁

当一个线程需要调用该对象的wait()方法时,该线程必须拥有该对象的锁,然后它将释放该对象的锁并进入等待状态,直到其他线程在该对象上调用notify()方法. 同样,当线程需要调用对象的notify()方法时,它将释放该对象的锁,以便其他等待线程可以获取该对象的锁. 由于所有这些方法都要求线程持有对象的锁(只能通过同步来实现),因此只能在同步方法或同步块中调用它们.

Thread类的sleep()和yield()方法将在当前正在执行的线程上运行. 因此,在其他正在等待的线程上调用这些方法没有任何意义. 这就是为什么这些方法是静态的. 它们可以在当前正在执行的线程中工作,并且避免程序员错误地认为可以在其他非运行线程中调用这些方法.

有很多方法可以确保Java中的线程安全性-同步,使用原子并发类,实现并发锁,使用volatile关键字,使用不变类和线程安全类.

当我们使用volatile关键字修改变量时,所有线程都会直接读取该变量,而不缓存它. 这样可以确保线程读取的变量与内存一致.

同步块是一个更好的选择,因为它不会锁定整个对象(当然,您也可以让它锁定整个对象). 即使此类中有多个不相关的同步块,同步方法也会锁定整个对象,这通常会导致它们停止执行并需要等待对此对象的锁定.

使用Thread类的setDaemon(true)方法将线程设置为守护程序线程. 需要注意的是,该方法需要在调用start()方法之前调用,否则将抛出IllegalThreadStateException.

ThreadLocal用于创建线程局部变量. 我们知道对象的所有线程将共享其全局变量,因此这些变量不是线程安全的. 我们可以使用同步技术. 但是,当我们不想使用同步时,可以选择ThreadLocal变量.

每个线程都有自己的Thread变量. 他们可以使用get()set()方法获取其默认值或程中更改其值. ThreadLocal实例通常希望将它们与线程状态关联为私有静态属性.

多线程避免死锁_线程死锁_避免线程死锁

ThreadGroup是一个类,其目的是提供有关线程组的信息.

ThreadGroup API相对较弱多线程避免死锁,并且没有提供比Thread更多的功能. 它具有两个主要功能: 一是获取线程组中处于活动状态的线程列表;另一种是设置线程以设置未捕获的异常处理程序(ncaught exception handler). 但是,在Java 1.5中,setUncaughtExceptionHandler(UncaughtExceptionHandler eh)方法也已添加到Thread类中,因此ThreadGroup已过时,建议不要继续使用它.

t1.setUncaughtExceptionHandler(newUncaughtExceptionHandler(){

@Override

publicvoiduncaughtException(线程t,可抛出e){

System.out.println(“发生例外: ” + e.getMessage());

}

});

多线程避免死锁_线程死锁_避免线程死锁

线程转储是JVM活动线程的列表,对于分析系统瓶颈和死锁非常有用. 有很多方法可以获取线程转储使用的Profiler,Kill -3命令,jstack工具等. 我更喜欢jstack工具,因为它易于使用并且是JDK附带的. 由于它是基于终端的工具,因此我们可以编写一些脚本来定期生成线程转储以进行分析.

死锁是指永远阻塞两个以上线程的情况. 这种情况至少需要两个以上的线程和两个以上的资源.

要分析死锁,我们需要查看Java应用程序的线程转储. 我们需要找出状态为“已阻塞”的线程以及它们正在等待的资源. 每个资源都有一个唯一的ID,使用此ID我们可以找出哪些线程已经拥有其对象锁.

避免嵌套锁,仅在需要时使用锁并避免无限期等待,这是避免死锁,学习如何分析死锁的常用方法.

java.util.Timer是一个工具类,可用于安排线程在将来的特定时间执行. Timer类可用于安排一次性任务或定期任务.

java.util.TimerTask是实现Runnable接口的抽象类. 我们需要继承此类以创建自己的定时任务,并使用Timer安排其执行时间.

线程池管理一组工作线程,并且还包括一个队列,用于放置等待执行的任务.

java.util.concurrent.Executors提供了用于创建线程池的java.util.concurrent.Executor接口的实现. 线程池示例说明了如何创建和使用线程池多线程避免死锁,或者ScheduledThreadPoolExecutor示例说明了如何创建定期任务

原始链接: ; utm_campaign = client_share&from = singlemessage&timestamp = 1520156940&app = news_article&utm_source = weixin&iid = 27298990033&utm_medium = toutiao_android&wxshare_count = 2&pbid = 6500852744902968845


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-208427-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...