相关文章

更多

最近更新

更多

java 线程状态转换图解

2021-11-07 15:49|来源: 网路

java线程状态转换图

java线程运行过程中的各个状态的转换如下图:

  1. 实例化后New

  2. New-->RUNNABLE

    Thread.start() ==>系统调度

    ​ running—>ready <==Thread.yield

    ​ ready-->running

  3. RUNNABLE-->WAITING Object.wait() Thread.join() LockSupport.park()

  4. RUNNABLE-->TIME_WAITING Object.wait(long) Thread.sleep(long) Thread.join(long) LockSupport.parkNanos() LockSupport.parkUntil()

  5. RUNNABLE-->BLOCKED 等待进入synchronized方法 等待进入synchronized块

  6. RUNNABLE-->TERMINATED

  7. WAITING-->RUNNABLE Object.notify() Object.notifyAll() LockSupport.unpark(Thread)

  8. TIME_WAITING-->RUNNABLE Object.notify() Object.notifyAll() LockSupport.unpark(Thread)

  9. BLOCK-->RUNNABLE

yield

  1. 暂停当前正在执行的线程对象。
  2. yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。
  3. yield()只能使同优先级或更高优先级的线程有执行的机会。
  4. yield()从未导致线程转到等待/睡眠/阻塞状态。在大多数情况下,yield()将导致线程从运行状态转到可运行状态,但有可能没有效果。

相关问答

更多
  • 可以通过以下原则解决: 1、设置线程池的最大线程数 2、设置线程池的并发处理线程数量 3、设置线程池最大的队列线程数 4、做好线程池的线程清理工作 做好这几点,理论上没问题了,具体还得看编程者代码的质量。 PS:服务器不可能为每一个请求都创建线程,得考虑到最大负载,当达到临界值的时候,服务器返回繁忙状态,拒绝服务即可,当然这是简单的处理办法。
  • JAVA多线程编程[2022-03-08]

    多线程程序中,如您说的四线程,2个对一个变量加1,2个对一个变量减1,如果这个变量声明的时候加了synchronized关键字,那么这个变量同时只能有一个线程访问,其他的线程会排队,如果没加,那么可能出现同时操作一个变量的情况,举例来说,1个加的线程和一个减的线程同时对一个值为3的变量进行操作,可能的结果是4或2.
  • getName() 方法是Thread类中的方法,你MyThread继承了Thread,当然可以直接使用父类里的public方法 了
  • 多线程的同步锁通过synchronized实现 有俩种方式 一种是在代码块加锁 代码块加锁时可以指定任意类的实例过的对象 即锁在这个对象上(任何对象都有一个锁) 使同一时间内只有一个线程可以访问到代码块中 另外一种就是以synchronized关键字修饰方法 这时加锁的对象就是类本身的实例 即this 以上 O(∩_∩)O
  • 如果你调用的方法抛出异常,那这时候就需要用到异常捕获。 try{ 程序主体 }catch(Exception类型 e){ 处理程序 } 线程可以通过两种方式来用,一个是继承Thread类,还有就是实现接口Runnable接口。 因为线程之间的切换比进程之间的切换要快的多,所以线程可以实现高速的同时运行。语言可能不太准确,不过意思是这样的。 最后建议你多看看视频教程,然后找几个简单的程序来根据自己的所学做分析,会有很大的进步的。
  • 要创建线程,创建一个扩展Thread类的新类,并实例化该类。 扩展类必须重写run()方法并调用start()方法才能开始执行线程。 在run()里面,你将定义构成一个新线程的代码。 理解run()可以调用其他方法,使用其他类并像主线程一样声明变量很重要。 唯一的区别是run()为程序中的另一个并发执行线程建立入口点。 这将在run()返回时结束。 public class MyThread extends Thread { String word; public MyThread(String ...
  • “线程安全”究竟意味着什么? 任何看过任何课程的程序员都会对课程的表现有所期待。 对我来说,“线程安全”意味着如果你从多个线程调用它的方法,你不应该改变你的期望。 而不是说“ SynchronizedInteger是线程安全的 ”,我宁愿明确保证是什么,在这种情况下,它们很容易总结:它就像一个volatile 。 您的“解决方案#2”和您的“解决方案#3”都保留了这一保证。 你的解决方案#1没有。 我们假设我们有一个[共享对象]。 在[共享对象]上定义的任何方法都应该以某种方式同步访问它的[state]以确 ...
  • 实际上,阻塞更容易实现,更可靠,并且不会引入任何额外的开销/延迟。 如果您不想使用join() ,请考虑使用CountDownLatch ,它允许您等待一组线程。 另一个更令人愉快的方法是使用轻量级ExecutorCompletionService包装的ExecutorCompletionService 。 两种方法都可以以非阻塞方式使用,例如仅窥视而不是阻塞和等待结果。 但是为了不浪费CPU周期,有一个单独的后台线程阻塞并等待结果并在所有工作线程完成后立即发送一些事件。 或者,让每个工作线程在完成后发送一 ...
  • 这些状态与Thread.State枚举中提到的状态相同。 “等待”是指,正如文档说明的: 由于调用以下方法之一,线程处于等待状态: Object.wait没有超时 Thread.join没有超时 LockSupport.park “监视器”是BLOCKED状态,其中线程正在等待获取对象上的锁定(因为它尝试输入synchronized块或方法,而另一个线程已经保存相关锁)。 These states are the same as mentioned in the Thread.State enum. "Wa ...
  • 一个假设你的意思是让线程停止当前的操作并抛出InterruptedException ? Java中的线程中断只是一个标志。 您可以在BLOCKED线程上调用interrupt() ,并在下次代码检查时看到该标志。 实现这种功能的主要问题是,关键字( synchronized )应该如何抛出异常? InterruptedException是一个经过检查的异常,必须在语言中声明每个同步方法(和块)并throws InterruptedException ,这不是一个有用的练习! 中断是一种通信工具,通常用于让 ...