zoukankan      html  css  js  c++  java
  • 并发编程——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状态。
  • 相关阅读:
    使用DIDatepicker
    使图片与背景融为一体
    CAGradientLayer的一些属性解析
    UIButton的titleLabel
    JAVA多线程和并发基础面试问答
    Java多线程技术学习笔记(一)
    【转】Java 内存模型及GC原理
    【转】JVM 基础知识
    【转】Java 类的生命周期详解
    JVM内存模型及内存分配过程
  • 原文地址:https://www.cnblogs.com/qq455988971/p/8251451.html
Copyright © 2011-2022 走看看