并发编程--线程基础

并发/高并发

简单来说,并发是指单位时间内能够同时处理的请求数。默认情况下Tomcat可以支持的最大请求数是150,也就是同时支持150个并发。当超过这个并发数的时候,就会开始导致响应延迟,连接丢失等问题。

影响服务器吞吐量的因素

硬件

CPU、内存、磁盘、网络

软件层面

最大化的利用硬件资源
线程数量、JVM内存分配大小、网络通信机制(BIO、NIO、AIO)、磁盘IO

线程数量如何提升服务端的并发数量

并发和并行

  • 并行是指两个或者多个事件在同一时刻发生;
  • 并发是指两个或多个事件在同一时间间隔内发生,这个词可以冲宏观和微观两个层面来讲,如果从微观
    角度来看。以线程为例,假设当前电脑的cpu是单核,但是能不能支持多线程呢?当然也是能的,此时
    如果是多线程运行的话,那么CPU是通过不断分配时间片的方式来实现线程切换,由于切换的速度足够
    快,我们很难感知到卡顿的过程。

Java中的线程

  • Runnable 接口
  • Thread 类
  • Callable/Future 带返回值的

Thread这个工具在哪些场景可以应用

  • 网络请求分发的场景
  • 文件导入
  • 短信发送场景

线程的基础

线程的生命周期

线程的启动到结束

  • 阻塞
  • WAITING
  • TIME_WAITING
  • BLOCKED
  • IO阻塞

Java线程的6种状态

$ZOK5@~RCI4FSIU@LPCE4(N.png

需要注意的是,操作系统中的线程除去 new 和 terminated 状态,一个线程真实存在的状态,只有:

  • ready :表示线程已经被创建,正在等待系统调度分配CPU使用权。
  • running :表示线程获得了CPU使用权,正在进行运算
  • waiting :表示线程等待(或者说挂起),让出CPU资源给其他线程使用
    在加上新建状态和死亡状态,一共5种

线程的启动

new Thread().start(); //启动一个线程
Thread t1=new Thread()
t1.run(); //调用实例方法


6RXO1M2Z84FBSO`9{FW96JV.png

线程的终止

线程什么情况下会终止
run方法执行结束
volatile jint _interrupted; // Thread.isInterrupted state
interrupt()的作用
设置一个共享变量的值 true
唤醒处于阻塞状态下的线程。

void os::interrupt(Thread* thread) {
   assert(Thread::current() == thread || Threads_lock->owned_by_self(), "possibility of dangling Thread   pointer"); 
   OSThread* osthread = thread->osthread();
 if (!osthread->interrupted()) { 
    osthread->set_interrupted(true); 
    //设置一个中断状态 
    // More than one thread can get here with the same value of osthread, // resulting in multiple notifications.     We do, however, want the store
    // to interrupted() to be visible to other threads before we execute unpark(). 
    OrderAccess::fence(); 
    ParkEvent * const slp = thread->_SleepEvent ;
     //如果是sleep中,唤醒
   if (slp != NULL) 
      slp->unpark() ; 
   }
  // For JSR166. Unpark even if interrupt status already was set
   if (thread->is_Java_thread()) 
      ((JavaThread*)thread)->parker()->unpark(); 
   ParkEvent * ev = thread->_ParkEvent ; 
   if (ev != NULL) ev->unpark() ; 
  }

interrupt()的作用

  • 设置一个共享变量的值 true
  • 唤醒处于阻塞状态下的线程。

你可能感兴趣的:(并发编程--线程基础)