• 并发编程——java线程基础之线程状态转换


    线程的基本概念

    线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。

    ——百度百科

    线程的转换状态

    线程的创建

      线程的创建有两种方法,一种是implements自Runnable接口,一种是扩展自Thread类,两者均需要实现run方法。当线程对象被new出来时,线程进入到初始状态,当线程执行了start方法时,线程进入到可运行状态(很短,很快进入到执行状态)。

    Runnable接口
     1 package base.newthread;
     2 
     3 public class Thread2 extends Thread {
     4 
     5     @Override
     6     public void run() {
     7         System.out.println(Thread.currentThread().getName());
     8     }
     9     
    10 }
    Thread类
     1 package base.newthread;
     2 
     3 public class Main {
     4     public static void main(String[] args) {
     5         
     6         Thread1 runnable1 = new Thread1(); 
     7         Thread t1 = new Thread(runnable1, "t1");//线程进入初始状态
     8         t1.start(); //线程进入到就绪状态
     9         
    10         Thread2 t2 = new Thread2(); //线程进入初始状态
    11         t2.setName("t2");
    12         t2.start(); //线程进入到就绪状态
    13     }
    14 }
    线程的创建

    线程的让出

      进程在执行状态时,时间片被用完或主动执行了yield方法,则该进程会释放执行态资源进入到可运行状态等待被重新调度。下面的例子大体可以看出调用yield与不调用yield方法的区别。

     1 package base.yield;
     2 
     3 public class Thread1 implements Runnable{
     4 
     5     @Override
     6     public void run() {
     7         for (int i = 0; i < 100; i++) {
     8             System.out.println(Thread.currentThread().getName() + ":" + i);
     9             //Thread.yield();
    10         }
    11     }
    12 }
    Runnable接口
     1 package base.yield;
     2 
     3 public class Thread2 extends Thread {
     4 
     5     @Override
     6     public void run() {
     7         for (int i = 0; i < 100; i++) {
     8             System.out.println(Thread.currentThread().getName() + ":" + i);
     9             //Thread.yield();
    10         }
    11     }
    12     
    13 }
    Thread类
     1 package base.yield;
     2 
     3 public class Main {
     4     public static void main(String[] args) {
     5         
     6         Thread1 runnable1 = new Thread1(); 
     7         Thread t1 = new Thread(runnable1, "t1");//线程进入初始状态
     8         t1.start(); //线程进入到就绪状态
     9         
    10         Thread2 t2 = new Thread2(); //线程进入初始状态
    11         t2.setName("t2");
    12         t2.start(); //线程进入到就绪状态
    13     }
    14 }
    客户端类

    线程的阻塞

    线程进入阻塞有三种分类:

    • 调用synchronize进入到锁池状态,当线程获取到锁资源则进入到runnable状态
    • 通过调用wait进入到等待队列,待其他进程调用了notify或notifyAll后进入到锁池状态,当线程获取到锁资源则进入到runnable状态
    • 通过调用sleep、调用join或是阻塞在等待输入,则进入到阻塞状态;当sleep时间到达或等待的进程执行结束或获取到输入结果后,线程进入到runnable状态。
  • 相关阅读:
    系统进程查看 --- 微软官方出品
    Chrome 浏览器网页保存为PDF文件
    Chrome Google浏览器下载
    最强Android书 架构大剖析 作者网站
    腾讯暑期夏令营之旅
    轨迹记录App是怎样对定位轨迹进行过滤、优化和平滑处理的
    android-8~23 View.java
    android-23 View.java
    The server encountered an internal error that prevented it from fulfilling this request.
    Android Event
  • 原文地址:https://www.cnblogs.com/qq455988971/p/8251451.html
Copyright © 2020-2023  润新知