Day24_8 Java学习之线程池、网络编程及TCP通信程序

本文介绍了Java中的线程池概念,包括线程池的使用和优势,通过Runnable和Callable接口展示了线程池的两种用法。接着探讨了网络编程的基础,如网络通信协议的分类,TCP协议的特点。最后讲解了TCP通信程序,包括ServerSocket和Socket类的使用,以及数据的发送与接收方法。
摘要由CSDN通过智能技术生成

目录

一、线程池

线程池的概述

 线程池的使用一(不带返回值)

线程池使用二(带返回值) 

多线程使用总结 

二、网络编程

网络通信协议

协议的分类 

 网络编程三要素

三、TCP通信程序

TCP通信程序的概述

ServerSocket类(服务端类)  

Socket类(客户端类)

如何发送与接收数据呢?


一、线程池

  • 线程池的概述

解析:

1.通过前面的文章讲述想必大家都知道了什么是线程,由于在使用线程时,若我们并发的线程及多,一个线程完成一个任务之后就死亡销毁,这样频繁的创建销毁是非常的消耗时间资源的,会极大的降低程序运行效率。

2.为了解决上述的问题,就有了线程池。线程池:就是根据程序的运行需求先创建好N条线程放在线程池中等待,在需要时才随机的从池中抽取线程进行任务,任务完成后又回到线程池变成等待的空闲状态,这样会极大的提高效率。

3.合理利于线程池带来的好处:

3.1降低资源消耗。减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。

3.2提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。

3.3提高线程的可管理性。可以根据系统的承受能力,调整线程池中工作线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机或者宕机)。

  •  线程池的使用一(不带返回值)

解析:线程运行结束后不需要返回值时,使用Runnable接口

1.初学者水平还不够强大,建议使用使用Executors工程类来创建线程池对象。

1.1Executors类中有个创建线程池的方法如下:

public static ExecutorService newFixedThreadPool(int nThreads):作用:返回线程池对象。(创建的是有界线程池,也就是池中的线程个数可以指定最大数量)

1.2获取到了一个线程池ExecutorService 对象,那么怎么使用呢,在这里定义了一个使用线程池对象的方法如下:

public Future<?> submit(Runnable task):作用:获取线程池中的某一个线程对象,并执行其中Future接口:用来记录线程任务执行完毕后产生的结果。

 线程池使用演示:

线程任务类:

package com.feisi.week7.day3;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Task implements Runnable{
    // 生成100张票
    int tickets = 100;
    // 生成对象锁
    Lock lock = new ReentrantLock();
    @Override
    public void run() {
        // 模拟卖票
        while (true){
            // 上锁
            lock.lock();
            if(tickets >0){

                System.out.println(Thread.currentThread().getName()+"出售:"+tickets);
                tickets--;
            }
            // 解锁
            lock.unlock();
            // 上锁之后休眠语句块放在是否会更好?
            try {
                // 让线程休眠一下
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

测试类:

package com.feisi.week7.day3;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Test {
    public static void main(String[] args) {
        // 线程池的使用
        // 创建任务类线程
        Task task = new Task();

        // 创建线程池 放4条线程
        ExecutorService executorService = Executors.newFixedThreadPool(4);
        // 随机抽取四条线程开始任务
        executorService.submit(task);
        executorService.submit(task);
        executorService.submit(task);
        executorService.submit(task);
    }
}

 运行结果:

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值