Java并发编程|第一篇:线程初体验

本文围绕Java中线程的使用展开,介绍了使用线程的几种方式,如Runnable接口、Thread类等,阐述了线程可合理利用多核心CPU资源提高程序吞吐量的作用。还通过request请求处理的实际例子,展示了多线程结合队列异步化处理提高程序性能的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系列文章

1. java中如何使用线程

  • 1.Runnable接口
  • 2.Thread类(本质上也是实现Runnable接口)
  • 3.Callable/Future带返回值的线程
  • 4.线程池ThreadPool

2. 线程作用

线程可以合理利用多核心CPU资源,提高程序的吞吐量

3.Thread类本质上也是实现Runnable接口

jdk源码 Thread实现了Runnable接口
在这里插入图片描述
重写了run()方法
在这里插入图片描述
target其实是我们传入的对象
测试代码:

public class App extends Thread {

    @Override
    public void run() {
        System.out.println("running!!!!");
    }

    public static void main(String[] args) {
     new Thread(new App()).start();
    }
}

测试结果:
在这里插入图片描述

4.实际例子

4.1预设场景:request请求处理

request请求的处理逻辑如下:

  • 1.预处理
  • 2.打印
  • 3.保存

整条链路是串行的处理逻辑
但是在每个链节点上的处理使用多线程的方式+队列的方式异步化进行处理了,从而提高程序的性能
在这里插入图片描述

4.2 代码

处理类设计逻辑:

  • 使用LinkedBlockingQueue来做异步队列的处理
  • 使用责任链模式来完成流程的处理
  • 继承Thread类,重写run方法,在run方法中nextProcessor.process(take);调用下一个链的节点进行处理

4.2.1 request

request对象

public class Request {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
    @Override
    public String toString() {
        return "Request{" +
                "name='" + name + '\'' +
                '}';
    }
}

4.2.2 IRequestProcessor

处理request请求统一接口

public interface IRequestProcessor {
    void process(Request request);
}

4.2.3 PrevProcessor

预处理类

import java.util.concurrent.LinkedBlockingQueue;

public class PrevProcessor extends Thread implements IRequestProcessor {

    //阻塞队列 消息异步处理
    LinkedBlockingQueue<Request> requests = new LinkedBlockingQueue();

    private IRequestProcessor nextProcessor;

    private volatile boolean isFinish = false;

    public PrevProcessor(IRequestProcessor nextProcessor) {
        this.nextProcessor = nextProcessor;
    }

    public PrevProcessor() {
    }

    public void shutDwon() {
        isFinish = true;
    }

    @Override
    public void run() {
        while (!isFinish) {
            try {
                Request take = requests.take();
                System.out.println("PrevProcess" + take);
                nextProcessor.process(take);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void process(Request request) {
        //根据实际需求做处理
        requests.add(request);
    }
}

4.2.4 PrintProcessor

 import java.util.concurrent.LinkedBlockingQueue;

public class PrintProcessor extends Thread implements IRequestProcessor {
    //阻塞队列 消息异步处理
    LinkedBlockingQueue<Request> requests = new LinkedBlockingQueue();

    private IRequestProcessor nextProcessor;

    private volatile boolean isFinish = false;

    public PrintProcessor(IRequestProcessor nextProcessor) {
        this.nextProcessor = nextProcessor;
    }

    public PrintProcessor() {
    }

    public void shutDwon() {
        isFinish = true;
    }

    @Override
    public void run() {
        while (!isFinish) {
            try {
                Request take = requests.take();
                System.out.println("PrintProcess" + take);
                if (null != nextProcessor) {
                    nextProcessor.process(take);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void process(Request request) {
        //根据实际需求做处理
        requests.add(request);
    }
    
}

4.2.5 SaveProcessor

import java.util.concurrent.LinkedBlockingQueue;

public class SaveProcessor extends Thread implements IRequestProcessor {
    //阻塞队列 消息异步处理
    LinkedBlockingQueue<Request> requests = new LinkedBlockingQueue();

    private IRequestProcessor nextProcessor;

    private volatile boolean isFinish = false;

    public SaveProcessor(IRequestProcessor nextProcessor) {
        this.nextProcessor = nextProcessor;
    }

    public SaveProcessor() {
    }

    public void shutDwon() {
        isFinish = true;
    }

    @Override
    public void run() {
        while (!isFinish) {
            try {
                Request take = requests.take();
                System.out.println("SaveProcessor" + take);
                if (null != nextProcessor) {
                    nextProcessor.process(take);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void process(Request request) {
        //根据实际需求做处理
        requests.add(request);
    }
}

4.2.6 测试调用

public class Test {

    static IRequestProcessor requestProcessor;

     public void setUp() {
        SaveProcessor saveProcessor = new SaveProcessor();
        saveProcessor.start();
        PrintProcessor printProcessor = new PrintProcessor(saveProcessor);
        printProcessor.start();
        requestProcessor = new PrevProcessor(printProcessor);
        ((PrevProcessor) requestProcessor).start();
    }

    public static void main(String[] args) {

        Test test = new Test();
        test.setUp();
        Request request = new Request();
        request.setName("xwf");

        requestProcessor.process(request);

    }


}

结果:
在这里插入图片描述

5.参考

腾讯课堂->咕泡学院->mic老师->并发编程基础

6.系列链接

下一篇:Java并发编程|第二篇:线程生命周期

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值