• Java:多线程(一)


    Java中线程的五种状态:

    1. 新建状态(New)
    2. 就绪状态(Runnable)
    3. 运行状态(Running)
    4. 阻塞状态(Blocked)
    5. 凋亡状态(Dead)

    其中阻塞状态(Blocked)又分为三种:

    1. 等待阻塞:运行状态中的线程执行wait( )方法,使本线程进入到等待阻塞状态
    2. 同步阻塞:线程在获取synchronized同步锁失败(因为锁被其他线程占用),会进入同步阻塞
    3. 其他阻塞:通过调用线程的sleep( )或join( )或发出了I/O请求时,线程会进入到阻塞状态。当sleep( )状态超时、join( )等待进程终止或超时、或者I/O处理完毕时,线程重新转入就绪状态

    线程的创建有三种基本形式:

    1. 继承Thread类,重写该类的run( )方法
    2. 实现Runnable接口,并重写该接口的run( )方法,创建Runnable实例类的实例,并以此实例作为Thread类的target来创建Thread,该Thread对象才是真正的线程对象
    3. 使用Callable和Future接口创建线程

    继承java.lang.Thread类 实例:

    class MyThread extends Thread{  
       @Override
       public void run() {
           for (int x = 0; x < 200; x++) {
               System.out.println(x);
           }
       }
    }
    public class Main { public static void main(String[] args) {        // 创建两个线程对象
           MyThread my1 = new MyThread();
           MyThread my2 = new MyThread();

           my1.start();
           my2.start();
    } }

    程序启动运行main时候,java虚拟机启动了一个进程,主线程main在main( )调用时候被创建。随着调用Thread对象的start方法,线程才正式启动。

    调用star方法并不是立即执行多线程代码,而是使得该线程变为可运行态(Runnable),什么时候运行是由操作系统决定的。

    多线程程序都是乱序执行,因此,只有乱序执行的代码才有必要设计为多线程。

    Thread.sleep()方法可以不让当前线程独自霸占该进程所获取的CPU资源,以留出一定时间给其他线程执行的机会。实际上所有的多线程代码执行顺序都是不确定的,每次执行的结果都是随机的。

    实现java.lang.Runnable接口 实例:

    class MyRunnable implements Runnable {
       @Override
       public void run() {
           for (int x = 0; x < 100; x++) {
               System.out.println(x);
           }
       }
    } public class Main { public static void main(String[] args) {        // 创建MyRunnable类的对象
           MyRunnable my = new MyRunnable();

           Thread t1 = new Thread(my);
           Thread t2 = new Thread(my);

           t1.start();
           t2.start();
    } }

    run( )方法是多线程程序的一个约定。所有的多线程代码都在run方法里面。Thread类实际上也是实现了Runnable接口的类。

    在启动的多线程的时候,需要先通过Thread类的构造方法Thread(Runnable target) 构造出对象,然后调用Thread对象的start()方法来运行多线程代码。
    实际上所有的多线程代码都是通过运行Thread的start()方法来运行的。因此,不管是扩展Thread类还是实现Runnable接口来实现多线程,最终还是通过Thread的对象的API来控制线程的,熟悉Thread类的API是进行多线程编程的基础。

    非原创,文章参考

    https://www.cnblogs.com/lwbqqyumidi/p/3804883.html

    https://www.cnblogs.com/yjd_hycf_space/p/7526608.html 

     https://www.cnblogs.com/dolphin0520/p/3932921.html

    侵删

  • 相关阅读:
    ASP.NET AJAX入门系列(7):使用客户端脚本对UpdateProgress编程
    ASP.NET AJAX入门系列(9):在母版页中使用UpdatePanel
    全面剖析C#正则表达式
    c# 正则表达式基础知识
    代理模式(Proxy Pattern)
    ASP.NET AJAX入门系列(8):自定义异常处理
    ASP.NET AJAX入门系列(2):使用ScriptManager控件
    ASP.NET AJAX入门系列(5):使用UpdatePanel控件(二)
    ASP.NET AJAX入门系列(6):UpdateProgress控件简单介绍
    ASP.NET AJAX入门系列(1):概述
  • 原文地址:https://www.cnblogs.com/colin220/p/9631705.html
Copyright © 2020-2023  润新知