一、并发/高并发
服务端1s内能承载的请求数量称为并发量,决定并发量/优化提高并发可以从两个方面入手:
1、硬件:CPU、内存、磁盘、网络
2、软件:最大化的利用硬件资源。
线程数量、jvm内存分配大小、网络通信机制(BIO\NIO\AIO)、磁盘IO
二、线程特点和创建方式
多线程特点:异步、并行
通过这两个特点可以提高并发量
Java中的线程创建方法
- Runnable:实现此接口
public class InterruptDemo implements Runnable{
@Override
public void run() {
while(!Thread.currentThread().isInterrupted()){
try {
TimeUnit.SECONDS.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
Thread.currentThread().interrupt();
}
}
System.out.println("processor End");
}
public static void main(String[] args) {
Thread t1 = new Thread(new InterruptDemo());
t1.start();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
t1.interrupt();
}
}
- Thread:继承此类
public class ThreaTest extends Thread{
@Override
public void run() {
//业务逻辑
}
public static void main(String[] args) {
ThreaTest threaTest = new ThreaTest();
threaTest.start();
}
}
- Callable/Future:带返回值的
public class CallableDemo implements Callable<String> {
@Override
public String call() throws Exception {
System.out.println("成功");
return "success";
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService executorService = Executors.newFixedThreadPool(1);
CallableDemo callableDemo = new CallableDemo();
Future<String> future = executorService.submit(callableDemo);
System.out.println(future.get());//get是阻塞的,需要线程完成才能拿到值
}
}
- 使用线程池
三、Java中线程的生命周期
线程生命周期.png
Java线程生命周期有6中状态。
操作系统线程生命周期有5中状态,没有NEW和终止状态,但把运行状态拆为(就绪和运行两种,JAVA视为一种--运行状态)。
四、java线程是如何触发的
线程的触发.png
1、java代码执行start方法,底层调用JVM,JVM再调用操作系统
2、操作系统执行调度算法,找到空闲的CPU去执行线程指令,操作系统调用JVM 的run,jvm再调用Java代码的run
3、这个线程执行结束之后,JVM销毁线程
五、线程的终止
1.stop()方法。但不建议使用,会不安全,因为不知道一个线程的指令执行到什么状态,直接终止会引发很多问题。
2.interrupt()方法,不能直接终止,给线程发一个终断信号,最终是否终止还需要线程自己决定。interrupt的本质上是通过一个共享变量来实现线程直接的通信
public class InterruptDemo implements Runnable{
@Override
public void run() {
//Thread.currentThread().isInterrupted()中断信号标志,默认false,当接收到中断信号会抛出异常,
// 同时中断信号标志复位为false,线程是否结束需要在catch中处理,
//例如Thread.currentThread().interrupt();再次中断,此时就会结束
while(!Thread.currentThread().isInterrupted()){
try {
TimeUnit.SECONDS.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
Thread.currentThread().interrupt();
}
}
System.out.println("processor End");
}
public static void main(String[] args) {
Thread t1 = new Thread(new InterruptDemo());
t1.start();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
//这里面一定要有处理,无论是结束线程还是不结束线程,这样发送的信号才有意义
e.printStackTrace();
}
//发送中断信号
t1.interrupt();
}
}