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

    1.基本概念

    进程:内存中正在运行的一个应用程序。一个进程包含多个线程。

    线程:进程中的一个执行流程。

    多线程:有两个或两个以上的并发执行流程。

    2.线程的生命周期

    说明:

    1. 新建状态(New)         : 线程对象被创建后,就进入了新建状态。例如,Thread thread = new Thread()。
    2. 就绪状态(Runnable): 也被称为“可执行状态”。线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程。例如,thread.start()。处于就绪状态的线程,随时可能被CPU调度执行。
    3. 运行状态(Running) : 线程获取CPU权限进行执行。需要注意的是,线程只能从就绪状态进入到运行状态。
    4. 阻塞状态(Blocked)  : 阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
        (01) 等待阻塞 -- 通过调用线程的wait()方法,让线程等待某工作的完成。
        (02) 同步阻塞 -- 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态。
        (03) 其他阻塞 -- 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
    5. 死亡状态(Dead)    : 线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

     3.线程的实现方式

     线程的实现主要有2中方式

    一、实现Runnable接口

    Runnable 是一个函数式接口,该接口中只包含了一个run()方法

    Runnable的作用,实现多线程。我们可以定义一个类A实现Runnable接口;然后,通过new Thread(new A())等方式新建线程。

    package org.langtong.javademo;
    
    public class MyRunnableThread implements Runnable {
        //定义总票数
        private int ticket = 100;
        //定义编号
        private int no = ticket+1;
        //定义线程同步对象
        private Object ob = new Object();
        @Override
        public void run() {
           while (true){
               synchronized (this.ob){
                   if(this.ticket>0){
                       try {
                           Thread.sleep(100);
                       }catch (Exception e){
    
                       }
                       System.out.println(Thread.currentThread().getName()+"售出第"+(this.no-this.ticket)+"张票");
                       this.ticket--;
    
                   }else {
                       System.out.println("票已卖完!");
                       System.exit(0);
                   }
               }
           }
        }
    }
    package org.langtong.javademo;
    
    /**
     * 多线程买票
     * 3个人卖10张票
     */
    public class MultiThreads {
        public static void main(String[] args) {
            MyRunnableThread myRunnableThread = new MyRunnableThread();
            Thread t1 = new Thread(myRunnableThread);
            Thread t2 = new Thread(myRunnableThread);
            Thread t3 = new Thread(myRunnableThread);
            Thread t4 = new Thread(myRunnableThread);
            t1.start();
            t2.start();
            t3.start();
            t4.start();
        }
    }
    Thread-0售出第2张票
    Thread-0售出第3张票
    Thread-0售出第4张票
    Thread-0售出第5张票
    Thread-3售出第6张票
    Thread-1售出第7张票
    Thread-2售出第8张票
    Thread-1售出第9张票
  • 相关阅读:
    java 中类的加载顺序
    jdbc 连接数据库、批量操作、事务(oracle、mysql)
    一个空格引发的血案啊!
    Servlet 的生命周期与线程安全
    Java 方法的重写与重载
    java 序列化
    equals()与hashcode()的理解
    成功安装cadence SPB16.0
    stack implement C++
    windows 7 设置环境变量的方法
  • 原文地址:https://www.cnblogs.com/kwzblog/p/11833108.html
Copyright © 2011-2022 走看看