赣州建设监督网站,建筑培训网安全员考试成绩查询,西部数码备案域名购买,wordpress rest图片目录
52、什么是线程池#xff1f; 为什么要使用它#xff1f;
53、怎么检测一个线程是否拥有锁#xff1f;
54、你如何在 Java 中获取线程堆栈#xff1f;
55、JVM 中哪个参数是用来控制线程的栈堆栈小的?
56、Thread 类中的 yield 方法有什么作用#xff1f;
57、…目录
52、什么是线程池 为什么要使用它
53、怎么检测一个线程是否拥有锁
54、你如何在 Java 中获取线程堆栈
55、JVM 中哪个参数是用来控制线程的栈堆栈小的?
56、Thread 类中的 yield 方法有什么作用
57、Java 中 ConcurrentHashMap 的并发度是什么
58、Java 中 Semaphore 是什么
59、Java 线程池中 submit() 和 execute()方法有什么区别
60、什么是阻塞式方法
61、Java 中的 ReadWriteLock 是什么
62、volatile 变量和 atomic 变量有什么不同
63、可以直接调用 Thread 类的 run ()方法么
64、如何让正在运行的线程暂停一段时间
65、你对线程优先级的理解是什么
66、什么是线程调度器(Thread Scheduler)和时间分片(Time Slicing )
67、你如何确保 main()方法所在的线程是 Java 程序最后结束的线程
68、线程之间是如何通信的
69、为什么线程通信的方法 wait(), notify()和 notifyAll()被定义在 Object 类里
70、为什么 wait(), notify()和 notifyAll ()必须在同步方法或者同步块中被调用
71、为什么 Thread 类的 sleep()和 yield ()方法是静态的
72、如何确保线程安全
73、同步方法和同步块哪个是更好的选择
74、如何创建守护线程
75、什么是 Java Timer 类如何创建一个有特定时间间隔的任务 52、什么是线程池 为什么要使用它
创建线程要花费昂贵的资源和时间如果任务来了才创建线程那么响应时间会变长而且一个进程能创建的线程数有限。为了避免这些问题在程序启动的时候就创建若干线程来响应处理它们被称为线程池里面的线程叫工作线程。从JDK1.5 开始Java API 提供了 Executor 框架让你可以创建不同的线程池。 53、怎么检测一个线程是否拥有锁
在 java.lang.Thread 中有一个方法叫 holdsLock()它返回 true 如果当且仅当当前线程拥有某个具体对象的锁。 54、你如何在 Java 中获取线程堆栈
kill -3 [java pid]
不会在当前终端输出它会输出到代码执行的或指定的地方去。比如kill -3 tomcat pid, 输出堆栈到 log 目录下。
Jstack [java pid]
这个比较简单在当前终端显示也可以重定向到指定文件中。
-JvisualVMThread Dump
不做说明打开 JvisualVM 后都是界面操作过程还是很简单的。 55、JVM 中哪个参数是用来控制线程的栈堆栈小的?
-Xss 每个线程的栈大小 56、Thread 类中的 yield 方法有什么作用
使当前线程从执行状态运行状态变为可执行态就绪状态。
当前线程到了就绪状态那么接下来哪个线程会从就绪状态变成执行状态呢可能是当前线程也可能是其他线程看系统的分配了。 57、Java 中 ConcurrentHashMap 的并发度是什么
ConcurrentHashMap 把实际 map 划分成若干部分来实现它的可扩展性和线程安全。这种划分是使用并发度获得的它是 ConcurrentHashMap 类构造函数的一个可选参数默认值为 16这样在多线程情况下就能避免争用。
在 JDK8 后它摒弃了 Segment锁段的概念而是启用了一种全新的方式实现,利用 CAS 算法。同时加入了更多的辅助变量来提高并发度具体内容还是查看源码吧。 58、Java 中 Semaphore 是什么
Java 中的 Semaphore 是一种新的同步类它是一个计数信号。从概念上讲从概念上讲信号量维护了一个许可集合。如有必要在许可可用前会阻塞每一个acquire()然后再获取该许可。每个 release()添加一个许可从而可能释放一个正在阻塞的获取者。但是不使用实际的许可对象Semaphore 只对可用许可的号码进行计数并采取相应的行动。信号量常常用于多线程的代码中比如数据库连接池。 59、Java 线程池中 submit() 和 execute()方法有什么区别
两个方法都可以向线程池提交任务execute()方法的返回类型是 void它定义在Executor 接口中。
而 submit()方法可以返回持有计算结果的 Future 对象它定义在ExecutorService 接口中它扩展了 Executor 接口其它线程池类像ThreadPoolExecutor 和 ScheduledThreadPoolExecutor 都有这些方法。 60、什么是阻塞式方法
阻塞式方法是指程序会一直等待该方法完成期间不做其他事情ServerSocket 的accept()方法就是一直等待客户端连接。这里的阻塞是指调用结果返回之前当前线程会被挂起直到得到结果之后才会返回。此外还有异步和非阻塞式方法在任务完成前就返回。 61、Java 中的 ReadWriteLock 是什么
读写锁是用来提升并发程序性能的锁分离技术的成果。 62、volatile 变量和 atomic 变量有什么不同
Volatile 变量可以确保先行关系即写操作会发生在后续的读操作之前, 但它并不能保证原子性。例如用 volatile 修饰 count 变量那么 count 操作就不是原子性的。
而 AtomicInteger 类提供的 atomic 方法可以让这种操作具有原子性如getAndIncrement()方法会原子性的进行增量操作把当前值加一其它数据类型和引用变量也可以进行相似操作。 63、可以直接调用 Thread 类的 run ()方法么
当然可以。但是如果我们调用了 Thread 的 run()方法它的行为就会和普通的方法一样会在当前线程中执行。为了在新的线程中执行我们的代码必须使用Thread.start()方法。 64、如何让正在运行的线程暂停一段时间
我们可以使用 Thread 类的 Sleep()方法让线程暂停一段时间。需要注意的是这并不会让线程终止一旦从休眠中唤醒线程线程的状态将会被改变为 Runnable并且根据线程调度它将得到执行。 65、你对线程优先级的理解是什么
每一个线程都是有优先级的一般来说高优先级的线程在运行时会具有优先权但这依赖于线程调度的实现这个实现是和操作系统相关的(OS dependent)。我们可以定义线程的优先级但是这并不能保证高优先级的线程会在低优先级的线程前执行。线程优先级是一个 int 变量(从 1-10)1 代表最低优先级10 代表最高优先级。
java 的线程优先级调度会委托给操作系统去处理所以与具体的操作系统优先级有关如非特别需要一般无需设置线程优先级。 66、什么是线程调度器(Thread Scheduler)和时间分片(Time Slicing )
线程调度器是一个操作系统服务它负责为 Runnable 状态的线程分配 CPU 时间。一旦我们创建一个线程并启动它它的执行便依赖于线程调度器的实现。同上一个问题线程调度并不受到 Java 虚拟机控制所以由应用程序来控制它是更好的选择也就是说不要让你的程序依赖于线程的优先级。
时间分片是指将可用的 CPU 时间分配给可用的 Runnable 线程的过程。分配 CPU时间可以基于线程优先级或者线程等待的时间。 67、你如何确保 main()方法所在的线程是 Java 程序最后结束的线程
我们可以使用 Thread 类的 join()方法来确保所有程序创建的线程在 main()方法退出前结束。 68、线程之间是如何通信的
当线程间是可以共享资源时线程间通信是协调它们的重要的手段。Object 类中wait()\notify()\notifyAll()方法可以用于线程间通信关于资源的锁的状态。
69、为什么线程通信的方法 wait(), notify()和 notifyAll()被定义在 Object 类里
Java 的每个对象中都有一个锁(monitor也可以成为监视器) 并且 wait()notify()等方法用于等待对象的锁或者通知其他线程对象的监视器可用。在 Java 的线程中并没有可供任何对象使用的锁和同步器。这就是为什么这些方法是 Object 类的一部分这样 Java 的每一个类都有用于线程间通信的基本方法。 70、为什么 wait(), notify()和 notifyAll ()必须在同步方法或者同步块中被调用
当一个线程需要调用对象的 wait()方法的时候这个线程必须拥有该对象的锁接着它就会释放这个对象锁并进入等待状态直到其他线程调用这个对象上的 notify()方法。同样的当一个线程需要调用对象的 notify()方法时它会释放这个对象的锁以便其他在等待的线程就可以得到这个对象锁。由于所有的这些方法都需要线程持有对象的锁这样就只能通过同步来实现所以他们只能在同步方法或者同步块中被调用。 71、为什么 Thread 类的 sleep()和 yield ()方法是静态的
Thread 类的 sleep()和 yield()方法将在当前正在执行的线程上运行。所以在其他处于等待状态的线程上调用这些方法是没有意义的。这就是为什么这些方法是静态的。它们可以在当前正在执行的线程中工作并避免程序员错误的认为可以在其他非运行线程调用这些方法。 72、如何确保线程安全
在 Java 中可以有很多方法来保证线程安全——同步使用原子类(atomic concurrent classes)实现并发锁使用 volatile 关键字使用不变类和线程安全类。 73、同步方法和同步块哪个是更好的选择
同步块是更好的选择因为它不会锁住整个对象当然你也可以让它锁住整个对象。同步方法会锁住整个对象哪怕这个类中有多个不相关联的同步块这通常会导致他们停止执行并需要等待获得这个对象上的锁。同步块更要符合开放调用的原则只在需要锁住的代码块锁住相应的对象这样从侧面来说也可以避免死锁。 74、如何创建守护线程
使用 Thread 类的 setDaemon(true)方法可以将线程设置为守护线程需要注意的是需要在调用 start()方法前调用这个方法否则会抛出IllegalThreadStateException 异常。 75、什么是 Java Timer 类如何创建一个有特定时间间隔的任务
java.util.Timer 是一个工具类可以用于安排一个线程在未来的某个特定时间执行。Timer 类可以用安排一次性任务或者周期任务。
java.util.TimerTask 是一个实现了 Runnable 接口的抽象类我们需要去继承这个类来创建我们自己的定时任务并使用 Timer 去安排它的执行。 要想了解更多
千题千解·Java面试宝典_时光の尘的博客-CSDN博客