多线程进阶001 之 在线程中执行任务

当围绕”任务执行” 来设计应用程序结构时,第一步就是要找出清晰的任务边界.在理想情况下,各个任务之间是相互独立的.
大多数服务器应用程序都提供了一种自然的任务边界选择方式: 以独立的客户请求为边界.

串行的执行任务

在应用程序中可以通过多种策略来调度任务,而其中一些策略能够更好地利用潜在的并发性.最简单的策略就是在单个线程中串行的执行各项任务.

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class SingleThreadWebServer {
    public static void main(String[] args) throws IOException {
        @SuppressWarnings("resource")
        ServerSocket socket = new ServerSocket(80);
        while(true){
            Socket connection = socket.accept();
            handleRequest(connection);
        }
    }

    private static void handleRequest(Socket connection) {
        //...
    }
}

实际生成环境中,这样执行会非常糟糕,因为它每次只能处理一个请求.

显式地为任务创建线程
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class ThreadPerTaskWebServer {
    public static void main(String[] args) throws IOException {
        @SuppressWarnings("resource")
        ServerSocket socket = new ServerSocket(80);
        while(true){
            Socket connection = socket.accept();
            new Thread(){
                public void run() {
                    handleRequest(connection);
                };
            }.start();
        }
    }

    private static void handleRequest(Socket connection) {
        //...
    }
}

在正常负载的情况下,”为每一个任务分配一个线程” 的方法能提升串行执行性能.
表面上看起来,这种做法很好,在真实环境下,千万不要这样做.
缺陷有:
1. 线程生命周期的开销非常高
2. 活跃的线程导致资源消耗严重
3. 稳定性受限,操作系统和JVM对创建线程的个数有限制
4. 过多的线程,降低程序执行速度

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值