zoukankan      html  css  js  c++  java
  • 多线程编程

        一个线程的生命周期

    • 新建状态:

              使用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态。它保持这个状态直到程序 start() 这个线程。

    • 就绪状态:

      当线程对象调用了start()方法之后,该线程就进入就绪状态。就绪状态的线程处于就绪队列中,要等待JVM里线程调度器的调度。

    • 运行状态:

      如果就绪状态的线程获取 CPU 资源,就可以执行 run(),此时线程便处于运行状态。处于运行状态的线程最为复杂,它可以变为阻塞状态、就绪状态和死亡状态。

    • 阻塞状态:

      如果一个线程执行了sleep(睡眠)、suspend(挂起)等方法,失去所占用资源之后,该线程就从运行状态进入阻塞状态。在睡眠时间已到或获得设备资源后可以重新进入就绪状态。可以分为三种:

      • 等待阻塞:运行状态中的线程执行 wait() 方法,使线程进入到等待阻塞状态。

      • 同步阻塞:线程在获取 synchronized 同步锁失败(因为同步锁被其他线程占用)。

      • 其他阻塞:通过调用线程的 sleep() 或 join() 发出了 I/O 请求时,线程就会进入到阻塞状态。当sleep() 状态超时,join() 等待线程终止或超时,或者 I/O 处理完毕,线程重新转入就绪状态。

    • 死亡状态:

      一个运行状态的线程完成任务或者其他终止条件发生时,该线程就切换到终止状态。


      线程的优先级

      每一个 Java 线程都有一个优先级,这样有助于操作系统确定线程的调度顺序。

      Java 线程的优先级是一个整数,其取值范围是 1 (Thread.MIN_PRIORITY ) - 10 (Thread.MAX_PRIORITY )。

      默认情况下,每一个线程都会分配一个优先级 NORM_PRIORITY(5)。

      具有较高优先级的线程对程序更重要,并且应该在低优先级的线程之前分配处理器资源。但是,线程优先级不能保证线程执行的顺序,而且非常依赖于平台。


      如何创建一个线程

      Java 提供了三种创建线程的方法:

    • 通过实现 Runnable 接口;
    • 通过继承 Thread 类本身;
    • 通过 Callable 和 Future 创建线程

          通过实现 Runnable 接口来创建线程

      创建一个线程,最简单的方法是创建一个实现 Runnable 接口的类。

      为了实现 Runnable,一个类只需要执行一个方法调用 run(),声明如下:

    • public void run()

      你可以重写该方法,重要的是理解的 run() 可以调用其他方法,使用其他类,并声明变量,就像主线程一样。

      在创建一个实现 Runnable 接口的类之后,你可以在类中实例化一个线程对象。

      Thread 定义了几个构造方法,下面的这个是我们经常使用的:

    • Thread(Runnable threadOb,String threadName);

      这里,threadOb 是一个实现 Runnable 接口的类的实例,并且 threadName 指定新线程的名字。

      新线程创建之后,你调用它的 start() 方法它才会运行。

      void start();

      下面是一个创建线程并开始让它执行的实例:

     1 class RunnableDemo implements Runnable {
     2    private Thread t;
     3    private String threadName;
     4    
     5    RunnableDemo( String name) {
     6       threadName = name;
     7       System.out.println("Creating " +  threadName );
     8    }
     9    
    10    public void run() {
    11       System.out.println("Running " +  threadName );
    12       try {
    13          for(int i = 4; i > 0; i--) {
    14             System.out.println("Thread: " + threadName + ", " + i);
    15             // 让线程睡眠一会
    16             Thread.sleep(50);
    17          }
    18       }catch (InterruptedException e) {
    19          System.out.println("Thread " +  threadName + " interrupted.");
    20       }
    21       System.out.println("Thread " +  threadName + " exiting.");
    22    }
    23    
    24    public void start () {
    25       System.out.println("Starting " +  threadName );
    26       if (t == null) {
    27          t = new Thread (this, threadName);
    28          t.start ();
    29       }
    30    }
    31 }
    32  
    33 public class TestThread {
    34  
    35    public static void main(String args[]) {
    36       RunnableDemo R1 = new RunnableDemo( "Thread-1");
    37       R1.start();
    38       
    39       RunnableDemo R2 = new RunnableDemo( "Thread-2");
    40       R2.start();
    41    }   
    42 }

    编译以上程序运行结果如下:

    Creating Thread-1
    Starting Thread-1
    Creating Thread-2
    Starting Thread-2
    Running Thread-1
    Thread: Thread-1, 4
    Running Thread-2
    Thread: Thread-2, 4
    Thread: Thread-1, 3
    Thread: Thread-2, 3
    Thread: Thread-1, 2
    Thread: Thread-2, 2
    Thread: Thread-1, 1
    Thread: Thread-2, 1
    Thread Thread-1 exiting.
    Thread Thread-2 exiting.

      通过 Callable 和 Future 创建线程

    • 1. 创建 Callable 接口的实现类,并实现 call() 方法,该 call() 方法将作为线程执行体,并且有返回值。
    • 2. 创建 Callable 实现类的实例,使用 FutureTask 类来包装 Callable 对象,该 FutureTask 对象封装了该 Callable 对象的 call() 方法的返回值。
    • 3. 使用 FutureTask 对象作为 Thread 对象的 target 创建并启动新线程。

     

    •  4. 调用 FutureTask 对象的 get() 方法来获得子线程执行结束后的返回值。

      线程的几个主要概念

      在多线程编程时,你需要了解以下几个概念:

    • 线程同步
    • 线程间通信
    • 线程死锁
    • 线程控制:挂起、停止和恢复

              说明:本文来自转载,只供参考,不做其他

  • 相关阅读:
    leetcode Power of Two
    leetcode Merge Two Sorted Lists
    Mac linux 安装memcached服务 用法
    Vsftp配置都没有问题 连接不上 530 Login incorrect 解决方法
    mysql 远程连接不上 %用户已经添加了
    Centos yum 安装mysql报错 No package mysql-server available.
    Linux 查询程序安装路径 是否安装
    php报错 Call to undefined function mb_stripos()
    mac编译openssl扩展报错 openssl.c:44:10: fatal error: 'openssl/evp.h' file not found
    在安装mysqli的时候,出现error: ext/mysqlnd/mysql_float_to_double.h: No such file or direc
  • 原文地址:https://www.cnblogs.com/knny/p/11545582.html
Copyright © 2011-2022 走看看