zoukankan      html  css  js  c++  java
  • Java多线程(一)

    1.概念

      线程:一个多线程程序包含两个或多个能并发运行的部分。程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径。

      进程:一个进程包括由操作系统分配的内存空间,包含一个或多个线程。一个线程不能独立的存在,它必须是进程的一部分。一个进程一直运行,直到所有的非守候线程都结束运行后才能结束。

    2.一个线程的生命周期

    3.线程的5种状态

    • 新建状态:

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

    • 就绪状态:

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

    • 运行状态:

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

    • 阻塞状态:

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

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

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

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

    • 死亡状态:

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

    4.Java线程的三种创建方法

    • 通过实现 Runnable 接口;
    package jsontest;
    
    public class RunableDemo implements Runnable {
        
        private Thread t ;
        private String name ;
        
        private RunableDemo(String name){
            this.name = name ;
            System.out.println("-----------新建线程"+name);
        }
    
        public Thread getT() {
            return t;
        }
    
        public void setT(Thread t) {
            this.t = t;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
        
        private void start() {
            if(t==null){
                t = new Thread(this,name);
                t.start();
            }
        }
    
        @Override
        public void run() {
            System.out.println("-----------线程:"+name+"被调用");
        }
        
        public static void main(String[] args) {
            RunableDemo d = new RunableDemo("testThread") ;
            d.start();
        }
    
    }
    • 通过继承 Thread 类本身
    • package jsontest;
      
      
      public class RunableDemo implements Runnable {
          
          @Override
          public void run() {
              for(int i=0;i<5;i++){
                  System.out.println("-----------"+i);
              }
          }
          
          public static void main(String[] args) {
              RunableDemo d = new RunableDemo() ;
              RunableDemo d2 = new RunableDemo() ;
              Thread t = new Thread(d) ;
              Thread t2 = new Thread(d2) ;
              t.start();
              t2.start();
          }
      
      }
    • 通过 Callable 和 Future 创建线程。

       上述主要讲解了三种常见的线程创建方式,对于线程的启动而言,都是调用线程对象的start()方法,需要特别注意的是:不能对同一线程对象两次调用start()方法。

    5.由于实际的业务需要,常常会遇到需要在特定时机终止某一线程的运行,使其进入到死亡状态。目前最通用的做法是设置一boolean型的变量,当条件满足时,使线程执行体快速执行完毕

      

    public class ThreadTest {
    
        public static void main(String[] args) {
    
            MyRunnable myRunnable = new MyRunnable();
            Thread thread = new Thread(myRunnable);
            
            for (int i = 0; i < 100; i++) {
                System.out.println(Thread.currentThread().getName() + " " + i);
                if (i == 30) {
                    thread.start();
                }
                if(i == 40){
                    myRunnable.stopThread();
                }
            }
        }
    }
    
    class MyRunnable implements Runnable {
    
        private boolean stop;
    
        @Override
        public void run() {
            for (int i = 0; i < 100 && !stop; i++) {
                System.out.println(Thread.currentThread().getName() + " " + i);
            }
        }
    
        public void stopThread() {
            this.stop = true;
        }
    
    }

    参考:http://www.cnblogs.com/lwbqqyumidi/p/3804883.html

  • 相关阅读:
    (引)spring学习笔记1.什么是控制反转
    Arduino 各种模块篇 步进电机 step motor 舵机 servo 直流电机 总复习
    Raspberry Pi Wireless Adaptor
    Pyramid 使用总结1
    Arduino 各种模块篇 人体红外感应模块 proximity sensor
    Pyramid 使用总结2
    Webcam Streaming Desktop Recording on Linux for ubuntu or its destros
    Arduino 各种模块篇 步进电机 step motor( 不用库,不用shield, 纯)
    Arduino 各种模块篇 motor shield 电机扩展板(舵机、直流电机、步进电机party)
    转载 stepper motors
  • 原文地址:https://www.cnblogs.com/-scl/p/7723020.html
Copyright © 2011-2022 走看看