zoukankan      html  css  js  c++  java
  • 对java多线程的认识

    多线程的概念:多线程是一种机制,它允许在程序中并发的执行多个线程,且每个线程间相互独立。

    实现多线程的两种方式:

    1、继承java.lang.Thread类,并且重写它的run方法,将线程的执行主体放在其中;

    2、实现java.lang.Runnable接口,实现它的run方法,并将线程的执行主体放在其中;

    线程有五大状态:

    1、新建状态(New):使用new操作符创建一个线程的时候,线程还没有开始执行;

    2、就绪状态(Runnable):当线程调用了start方法之后,线程就进入就绪状态;处于就绪状态的线程不一定立即运行run方法,只有获取到cpu时间才可以执行run方法;

    3、运行状态(running):当线程获取到了cpu运行时间之后,就进入到运行状态了,调用run方法;

    4、阻塞状态(blocked):正在运行的线程还没有结束,暂时让出cpu,这时其他就绪线程就有机会获得cpu时间;

    以下原因会导致线程进入阻塞状态:

    1、线程调用sleep方法进入睡眠状态;

    2、线程在调用一个在i/o上被阻塞的操作

    3、线程试图去获得一个锁,但是这个锁被其他线程持有;

    。。。。。。

    5、死亡状态(Dead):

    有以下的原因可导致线程死亡:

    1、run方法正常退出而正常死亡;

    2、一个未捕获的异常导致线程意外退出而死亡;

    可以用isAlive方法来判断线程是否还活着,只要是线程处于运行或者阻塞状态,就返回true;如果线程状态是New且不是可运行的状态或者线程死亡了,则返回false;

    线程同步(synchronized):

    可以同步方法,也可以同步代码块;对于同步方法来说,每个方法只有获取到所属类实例的锁才可以被执行,一旦该方法被执行,则独占锁,知道方法返回时或者异常退出时才会释放掉锁;

    同步代码块也是一样,当两个并发线程访问同一个对象中的这个synchronized(this)代码块的时候,一个时间内只有一个线程得到执行,另一个线程只有在这个线程执行完成之后才可以执行;

    线程同步之Lock:

    Lock是一个接口,它位于java 5.0新增的java.utils.concurrent包的子包locks中,实现Lock接口类具有与synchronized关键字相同的功能,但是它的功能强大一些,java.utils.concurrent.locks.ReentrantLock是比较常用的;注意需要在finally中unlock释放锁;

    线程阻塞:

    sleep()方法、suspend和resume方法、yield方法、wait和notify方法都可以使线程进入阻塞状态;但是yield方法和wait方法都会释放cpu时间,而sleep方法和suspend不会释放cpu时间;

    终止线程的方法:

    1、当run方法执行完毕,自动终止;

    2、使用stop方法,不过这个方法不推荐使用,会有意料不到的后果;

    3、使用interrupt方法

    多个客户端一个服务器的实现方法:

    利用多线程技术,服务器socket负责监听端口,设置一个无限循环,在其中实现:将监听到的socket实例赋值 给线程并且启动线程,由线程来完成业务逻辑;

  • 相关阅读:
    深度学习中一些常用函数的偏导数
    C++ 隐式类型转换与类型转换函数
    Tensorboard数据(tfevents文件)格式解析及ofstream使用问题
    记一次由unordered_map引起的bug
    softmax数值溢出 与 xent-loss问题
    C++ 单独编译(separate compilation)与 模板的编译
    TensorFlow源码分析——Tensor与Eigen
    ubuntu16.04 docker tensorflow-gpu镜像使用
    vscode Ftp-sync插件报错问题: sync error: Error: Permission denied
    PHP加速之eaccelerator
  • 原文地址:https://www.cnblogs.com/xulibing/p/5935940.html
Copyright © 2011-2022 走看看