【Java多线程】多线程之间是如何实现通信的?

基于Java多线程之间的通信关系的案列实现-----卖包子(并发线程) 通过分析需求,我们可以得知我们需要创建2个线程类,包子铺和吃包子的两个线程类。因为包子铺和吃包子的都是同一个包子,所以这里将包子作为对象锁。 1.创建一个包子类,设置包子的属性 /** * @author jianyeli */ public class Baozi { String pi; String xian; boolean flag = true; } 2.创建包子铺的线程类 /** *包子铺是一个线程类,继承Thread设置线程任务为做包子 * 对包子的状态进行判 阅读详情

你和你的朋友共同完成一个任务,你们随时交流对方的工作进度,因为有些任务是要对等待对方先完成再做,这个过程就是线程通信。


Table of Contents

synchronized实现通信

重入锁(ReentrantLock)实现通信

线程之间的通讯工具类

CountDownLatch(闭锁)

CyclicBarrier(栅栏)

Semaphore(信号量)


synchronized实现通信

进入等待(是Object类的方法):

  1. void wait();
  2. void wait(long timeoutMillis)
  3. void wait(long timeoutMillis, int nanos)
  4. wait方法执行后,会释放监视器,会释放锁!

唤醒(是Object类的方法):

  1. void notify();  随机唤醒一个正在wait的方法;
  2. void notifyAll();  唤醒所有正在wait的方法;

第一个同步程序:用三个线程模拟三个人报数。

/**
 * 功能:三个线程轮流报数
 *
 * @author KYLE
 *
 */
public class Main {

    public static void main(String[] args) {
        CountOff co = new CountOff();
        Thread t1 = new Thread(co);
        Thread t2 = new Thread(co);
        Thread t3 = new Thread(co);

        t1.setName("线程1");
        t2.setName("线程2");
        t3.setName("线程3");

        t1.start();
        t2.start();
        t3.start();
    }
}

class CountOff implements Runnable {
    private volatile int initNum = 1;
    private final int endNum = 10;

    @Override
    public void run() {
        synchronized (this) {
            while(initNum <= 10) {
                try {
                    System.out.println(Thread.currentThread().getName() + "报数:" + initNum++);
                    this.notifyAll(); //唤醒其他线程开始执行
                    this.wait(); //进入等待!
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            this.notifyAll();
        }
    }
}

重入锁(ReentrantLock)实现通信

进入等待(juc.locks.Condition接口):

  1. void await()   将线程放在这个条件的等待集中。
  2. boolean await(long time, TimeUnit unit)   使当前线程等待直到发出信号或中断,或指定的等待时间过去。
  3. long awaitNanos(long nanosTimeout)   使当前线程等待直到发出信号或中断,或指定的等待时间过去。
  4. void awaitUninterruptibly()   使当前线程等待直到发出信号。
  5. boolean awaitUntil(Date deadline)   使当前线程等待直到发出信号或中断,或者指定的最后期限过去。

 

唤醒:

  1. void signal()   随机唤醒一个等待集中的线程,解除其阻塞状态。
  2. void signalAll()   唤醒所有等待线程,解除阻塞状态。 

第一个重入锁实现的线程间通信:

程序功能:A线程通知B线程
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public class ThreadDemo {
	
	public static void main(String[] args) {
		ReentrantLockCondition rc = new ReentrantLockCondition();
		Thread t1 = new Thread(rc,"线程1");
		
		t1.start();
		
		//通知rc对象的t1线程继续执行!!!
		//如果没有以下三段代码,则在Console只会显示:线程1开始执行。。。
		rc.lock.lock();
		rc.cond.signal(); //通知rc对象的t1线程:可以继续执行了!
		rc.lock.unlock();
	}
}

class ReentrantLockCondition implements Runnable {
	public ReentrantLock lock = new ReentrantLock();
	public Condition cond = lock.newCondition(); //newCondition方法是juc.locks.Lock接口中的方法
	
	@Override
	public void run() {
		try {
			lock.lock();
			System.out.println(Thread.currentThread().getName()+"开始执行。。。");
			cond.await(); //使得本线程进入等待,并且能够释放当前锁
			System.out.println(Thread.currentThread().getName()+"线程继续执行。。。");
		} catch(InterruptedException e) {
			e.printStackTrace();
		} finally {
			lock.unlock();
		}
	}
}

输出:
线程1开始执行。。。
线程1线程继续执行。。。

线程之间的通讯工具类

为了能够更好控制线程之间的通信,Java为我们提供了一些工具类:

  1. CountDownLatch(闭锁)
  2. CyclicBarrier(栅栏)
  3. Semaphore(信号量)

CountDownLatch(闭锁)

CountDownLatch的功能:CountDownLatch是一个同步的辅助类,允许一个或多个线程一直等待,直到其它线程完成它们的操作。

特性:

  1. 来自juc.CountDownLatch类
  2. 它常用的API其实就两个:await()和countDown()

理解:

  1. count初始化CountDownLatch,然后需要等待的线程调用await方法。await方法会一直受阻塞直到count=0。而其它线程完成自己的操作后,调用countDown()使计数器count减1。当count减到0时,所有在等待的线程均会被释放
  2. 说白了就是通过count变量来控制等待,如果count值为0了(其他线程的任务都完成了),那就可以继续执行。
  3. 实例:你是一个实习生,其他的员工还没下班,你也不好意思走,等其他的员工都走光了,你再走。
第一个CountDownLatch程序
import java.util.Random;
import java.util.concurrent.CountDownLatch;

public class Main {
    public static void main(String[] args) {
        YourName aa = new YourName();
        aa.GoOffWork(); //下班了
    }
}

//你是一个实习生,在XxOo公司上班,其他的员工还没下班,你也不好意思走,等其他的员工都走光了,你再走。(改编自:Java3y)
class YourName {
    private int num; //公司人数
    private final CountDownLatch cd;

    public YourName() {
        Random rand = new Random();
        this.num = rand.nextInt(10); //随机获取一个公司人数
        cd = new CountDownLatch(num); //你必须等待公司全部人走了你才能走
    }

    //下班了
    public void GoOffWork() {
        System.out.println("现在6点下班了。。。");

        //启动你自己的下班线程
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //这里调用的是await()而不是wait()方法
                    cd.await(); //要等待其他人都走了(执行完毕),你才能走(执行)
                } catch(InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("其他员工都走了,我也可以下班了");
            }
        }).start();

        //公司其他员工的下班线程
        for(int i=0; i<num; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("员工xx下班了!");
                    cd.countDown();
                }
            }).start();
        }
    }
}

CyclicBarrier(栅栏)

理解:

  1. CyclicBarrier允许一组线程互相等待,直到到达某个点。
  2. 叫做cyclic是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用(对比于CountDownLatch是不能重用的)
  3. 区别:CountDownLatch注重的是等待其他线程完成;CyclicBarrier注重的是:当线程到达某个状态后,暂停下来等待其他线程,所有线程均到达以后,继续执行。
  4. 例如:你和你的朋友们(一组线程)约定一起去旅游,要等到所有朋友都到齐了以后(线程间相互等待),才能出发(到达某个点)。
第一个CyclicBarrier程序
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class Main {
    public static void main(String[] args) {
        Meet meet = new Meet();

        Thread t0 = new Thread(meet);
        Thread t1 = new Thread(meet);
        Thread t2 = new Thread(meet);
        Thread t3 = new Thread(meet);
        Thread t4 = new Thread(meet);

        t0.start();
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}

class Meet implements Runnable {
    private final CyclicBarrier cb = new CyclicBarrier(5, ()->{
        System.out.println("所有朋友都到了,可以出发去旅游了!");
    }); //你有5个朋友相约一起去旅游

    @Override
    public void run() {
        try {
            synchronized (this) {
                speedTime();
            }
            cb.await(); //等待所有朋友到齐
        } catch(InterruptedException | BrokenBarrierException e) {
            e.printStackTrace();
        }
    }

    //每个朋友需要到达聚会点的所花时间
    public void speedTime() {
        try {
            Thread.sleep(2000); //模拟这个朋友需要2s才能到达聚会点
        } catch(InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("朋友(线程):"+Thread.currentThread().getName()+"到达了!");
    }
}

Semaphore(信号量)

背景:

  1. 无论是内部锁synchronized还是重入锁ReentrantLock,一次都只允许一个线程访问一个资源;
  2. 那么,有些资源必须允许多个线程访问同时访问,应该怎么实现呢?
  3. 例如,某个小店(资源)一次只能允许5个顾客(多个线程)同时挑选购买,超过5个就需要排队等待了。

理解:

  1. Semaphore(信号量)实际上就是可以指定多个线程同时访问某一资源的一种解决方案。

构造方法:

  1. Semaphore(int permits) 使用给定数量的许可和非公平方式设置创建 Semaphore 。
  2. Semaphore(int permits, boolean fair) 使用给定数量的许可和公平的方式设置创建 Semaphore 。

核心方法:

  1. void acquire()  从此信号量上获取一个许可;如果没有则一直阻塞,直到有一个可用;或者线程为interrupted
  2. void acquire(int permits)  从此信号量获取给定数量的许可;阻塞直到所有可用;或者线程为 interrupted
  3. void acquireUninterruptibly() 从此信号量获取许可,如果没有一直阻塞,直到有一个可用

 

  1. boolean tryAcquire(int permits)  只有在调用时所有许可都可用时,才从此信号量获取给定数量的许可。【尝试获取】
  2. boolean tryAcquire(int permits, long timeout, TimeUnit unit)  如果在给定的等待时间内所有许可都可用,且当前线程不是 interrupted ,则从此信号量获取给定数量的许可。【时间等待获取】
  3. boolean tryAcquire(long timeout, TimeUnit unit)  如果在给定的等待时间内有可用的并且当前线程不是 interrupted ,则从该信号量获取许可。【时间条件获取】
  4. void release()  释放许可。
第一个信号量程序
import java.util.concurrent.Semaphore;

public class Main {
    public static void main(String[] args) {
        SemaphoreExample se = new SemaphoreExample();
        //准备6个线程
        Thread t0 = new Thread(se);
        Thread t1 = new Thread(se);
        Thread t2 = new Thread(se);
        Thread t3 = new Thread(se);
        Thread t4 = new Thread(se);
        Thread t5 = new Thread(se);

        t0.start();
        t1.start();
        t2.start();
        t3.start();
        t4.start();
        t5.start();
    }
}

class SemaphoreExample implements Runnable {
    private final Semaphore sema = new Semaphore(5); //某一资源同一时刻只能允许5个线程访问

    @Override
    public void run() {
        try {
            sema.acquire(); //申请对该资源的访问,但构造方法规定该资源一次只能允许5个线程同时访问
            System.out.println("线程"+Thread.currentThread().getName()+"正在访问该资源!");
            Thread.sleep(3000); //一旦申请成功,立即休眠3s,模拟该线程执行任务
        } catch(InterruptedException e) {
            e.printStackTrace();
        } finally {
            sema.release();
        }
    }
}

 


 

从触觉到视觉:GelSight传感器的工作原理与实战应用指南 本文深入解析了GelSight光学触觉传感器的核心工作原理,它通过将物理接触转化为视觉图像,为机器人提供了高精度的触觉感知。文章详细介绍了其在工业微观缺陷检测、机器人灵巧操作等领域的实战应用,并提供了从系统搭建到算法开发的完整指南,帮助工程师将这一前沿技术落地于实际项目。 阅读详情

相关推荐

【TM1650】STM8S TM1650芯片控制程序

以下为.h文件: #ifndef __TM1650_I2C_H #define __TM1650_I2C_H #include "stm8s.h" #include "stm8s_gpio.h" #include "tim1.h" #include "usart2.h" #include &lt;iostm8s103f3.h&gt; #include &lt;intrinsics....

cxw312864660的博客 1万+

Java线程之间如何通信的,有哪些方式?

尽可能避免共享变量,因为共享变量容易引起线程安全问题。对共享变量的访问需要加锁,以保证同步访问。避免死锁问题的发生。使用锁时需要特别注意加锁和释放锁的顺序。使用条件变量时,应该确保线程在调用 await() 方法之前已经获取了锁。否则,在等待条件成立的过程中,其他线程可能会修改共享资源,导致程序出现错误。 在使用信号量时,需要正确设置信号量的个数和调用 acquire() 和 release() 方法的顺序,否则可能会出现线程阻塞或信号量无法释放的情况。管道的使用需要注意线程之间的数据传输方式,以及缓冲区的

Ascend1977的博客 6796

从业10年的AI应用架构师:企业AI平台运营的4个核心经验,值得收藏

去年年底,我在某大型制造企业做AI咨询时,遇到了这样的场景:这不是个例。我接触过的10家企业中,有7家的AI平台都陷入了“技术自嗨”的陷阱——技术团队追求模型精度、功能完备性,却忽略了业务到底需要什么。如果你也遇到过类似问题:比如“模型准确率很高,但业务不买账”“AI项目上线后没人用”“投入产出比极低”,那么这篇文章的4个经验,可能会帮你避开这些坑。很多企业认为,AI平台就是“买一套工具+部署几个模型”。但实际上,企业AI平台的本质是“技术与业务的连接生态”:根据Gartner的报告,80%的企业AI项目失

AI 原生应用开发的博客 709

Java多线程之间的通信方式

在Java中线程通信主要有以下三种方式:如果线程之间采用synchronized来保证线程安全,则可以利用wait()、notify()、notifyAll()来实现线程通信。这三个方法都不是Thread类中所声明的方法,而是Object类中声明的方法。原因是每个对象都拥有锁,所以让当前线程等待某个对象的锁,当然应该通过这个对象来操作。并且因为当前线程可能会等待多个线程的锁,如果通过线程来操作,就非常复杂了。另外,这三个方法都是本地方法,并且被final修饰,无法被重写。wait()方法可以让当前线程释放对

weixin_49698553的博客 3544

iOS中.obj、.usdz、.dae和.scn格式之间的转化(思路清晰版)

作者最近在写项目的过程中遇到了一些3d模型格式问题,故写下这篇文章记录一下解决问题的过程。

yueliangmua的博客 5586

正版63棋牌源代码游戏+728游戏全套带前端源代码解析

这俩天抽时间仔细看了一下这套项目包含完整的前端、后端及后台管理系统。从上传的截图可以看出,前端基于资源目录,后端采用和,后台管理界面提供数据查询与管理功能。本篇文章将从前端结构、后端接口、数据库设计、常见 BUG 及优化方法等方面逐步拆解,并给出相应的代码示例和实践经验。

aa2031171的博客 3571

Java多线程之线程通信

创建两个线程,一个是生产者线程,蒸包子,另一个是消费者线程,吃包子,要求两个线程轮流执行(先生产再消费)。

u012135697的博客 1107

ClickHouse集群扩容实战:用clickhouse-copier搞定数据迁移与分片重平衡

本文详细介绍了使用clickhouse-copier工具实现ClickHouse集群从3分片到5分片的平滑扩容实战。通过分片级并行处理、原子性保证等核心机制,该工具能高效完成数据迁移与分片重平衡,同时保持服务连续性。文章涵盖集群拓扑规划、表结构检查、迁移配置、执行监控及迁移后优化等关键步骤,为大数据量场景下的ClickHouse扩容提供完整解决方案。

weixin_29091837的博客 294

java多线程-线程间通信

运行状态调用yield()出让cpu资源,调用suspend()、sleep()、wait()方法暂停线程,调用stop()、run()方法销毁。暂停状态调用resume()方法到运行,调用stop()方法销毁。带一个参数的wait(long)方法的功能是等待某一时间内是否有线程对锁进行notify()通知唤醒,如果超过这个时间则线程自动唤醒,能继续向下运行的前提是再次持有锁。join(long)方法的功能是在内部是使用wait(long)方法来进行实现的,所以join(long)方法具有释放锁的特点。

weixin_51343683的博客 679

2024年12月中国电子学会青少年软件编程(Python)等级考试试卷(五级)答案 + 解析

2024年12月中国电子学会青少年软件编程(Python)等级考试试卷(五级)答案 + 解析

伶俐角少儿编程 484

AI编程工具到底是初学者的绊脚石还是垫脚石?

现在是AI时代,我们要做的,是学会拥抱AI、使用AI,成为AI的驾驭者,如果你因为害怕使用AI学不到东西,那么大可不必,因为AI必然是今后的趋势,相信会用AI在今后的求职面试中也会有很大的占比。另外我之前写了多篇有关AI编程开发工具Trae的使用技巧和教程,需要的话你可以关注公众号后通过菜单栏获取。另外我也把所有Trae相关的文章整合到了腾讯ima知识库,感兴趣的可以关注公众号以后回复。

cpp加油站的专栏 184

Java 如何实现多线程之间的通讯和协作?

Java 如何实现多线程之间的通讯和协作?

javamyfriend的博客 887

CANoe:入门介绍

CANoe网络通信分析:CANoe用户可以在台架上或者车辆中分析ECU和整个系统的多总线通信。Trace窗口:用于列出所有总线活动,例如消息或错误帧。对于每条消息,都可以显示单独的信号值Graphics窗口:用于在时间轴上以图形方式在线显示消息和诊断请求中传输的值,例如rpm或温度值Statistics窗口:用于显示有用的网络和节点统计信息,例如节点和帧级别的总线负载、突发计数器/持续时间、帧和错误的计数器/速率、控制器状态Data窗口:用于显示预选数据,例如数字或条形图数据。

jasonj333 9748

在Java中实现多线程之间的通信

多线程之间的通信不仅仅是数据的传递,还包括线程间的协作和同步。在Java中实现多线程之间的通信是一个复杂但重要的任务,它涉及到线程同步、数据共享和线程间协作等多个方面。然而,这些方法的使用需要谨慎,因为它们可能导致死锁、活锁等问题。注意,在实际应用中,还需要考虑更多的细节和异常情况的处理。然而,在使用这些数据结构时,需要了解其内部实现原理和使用场景,以避免潜在的性能问题或数据不一致。:针对技术难点,给出具体的解决方案或优化建议,展示你的实践能力和解决问题的能力。:你是否了解Java中的线程协作机制,如。

484

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

java多线程实现服务器端与多客户端之间的通信

用java语言构建一个网络服务器,实现客户端和服务器之间通信,实现客户端拥有独立线程,互不干扰。 应用多线程来实现服务器与多线程之间的通信的基本步骤 服务器端创建ServerSocket,循环调用accept()等待客户端链接客户端创建一个Socket并请求和服务器端链接服务器端接受客户端请求,创建socekt与该客户端建立专线链接建立链接的socket在一个单独的线程上对话服务器

月影追猎者的博客 7783

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

java客户端 多线程_应用Java多线程实现服务器端与多客户端之间的通信

应用Java多线程来实现服务器与多线程之间的通信的基本步骤1、服务器端创建ServerSocket,循环调用accept()等待客户端链接2、客户端创建一个Socket并请求和服务器端链接3、服务器端接受客户端请求,创建socekt与该客户端建立专线链接4、建立链接的socket在一个单独的线程上对话5、服务器继续等待新的链接服务器端Server.javapackage test.concurre...

weixin_33102135的博客 307

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

java server多线程_应用java多线程实现server端与多client之间的通信

应用多线程来实现server与多线程之间的通信的基本步骤1、server端创建ServerSocket,循环调用accept()等待client链接2、client创建一个Socket并请求和server端链接3、server端接受client请求,创建socekt与该client建立专线链接4、建立链接的socket在一个单独的线程上对话5、server继续等待新的链接server端Server...

weixin_35507450的博客 424

java使用轮询和wait()/notify()实现多线程之间的通信

使用轮询方式实现通信: public class MyList { private static int i = 0; public int getI() { return i; } public void setI(int i) { MyList.i = i; } private volatile List

Aierbude的博客 2448

应用java多线程实现服务器端与多客户端之间的通信

应用多线程来实现服务器与多线程之间的通信的基本步骤 1、服务器端创建ServerSocket,循环调用accept()等待客户端链接 2、客户端创建一个Socket并请求和服务器端链接 3、服务器端接受客户端请求,创建socekt与该客户端建立专线链接 4、建立链接的socket在一个单独的线程上对话 5、服务器继续等待新的链接 服务器端Server.java p

qq_27245709的博客 1537

java多线程通过管道流实现不同线程之间的通信

java中的管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据。一个线程发送数据到输出管道,另外一个线程从输入管道中读取数据。通过使用管道,实现不同线程间的通信,而不必借助类似临时文件之类的东西。jdk提供4个类来使线程建可以进行通信。 (1)PipedInputStream与PipedOutputStream (2)PipedReader与PipedWriter  ...

weixin_34006468的博客 103

应用java多线程实现server端与多client之间的通信

应用多线程来实现server与多线程之间的通信的基本步骤 1、server端创建ServerSocket,循环调用accept()等待client链接 2、client创建一个Socket并请求和server端链接 3、server端接受client请求,创建socekt与该client建立专线链接 4、建立链接的socket在一个单独的线程上对话 5、server继续等待新的链...

weixin_34111819的博客 597

java线程 管道流_java多线程通过管道流实现不同线程之间的通信

java中的管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据。一个线程发送数据到输出管道,另外一个线程从输入管道中读取数据。通过使用管道,实现不同线程间的通信,而不必借助类似临时文件之类的东西。jdk提供4个类来使线程建可以进行通信。(1)PipedInputStream与PipedOutputStream(2)PipedReader与PipedWriter(1)Pipe...

weixin_35848310的博客 347

java 服务器多线程_java多线程实现服务器端与多客户端之间的通信

用java语言构建一个网络服务器,实现客户端和服务器之间通信,实现客户端拥有独立线程,互不干扰。应用多线程来实现服务器与多线程之间的通信的基本步骤服务器端创建ServerSocket,循环调用accept()等待客户端链接客户端创建一个Socket并请求和服务器端链接服务器端接受客户端请求,创建socekt与该客户端建立专线链接建立链接的socket在一个单独的线程上对话服务器继续等待新的链接服务...

weixin_36389335的博客 549

java多线程服务器端_应用java多线程实现服务器端与多客户端之间的通信

标签:应用多线程来实现服务器与多线程之间的通信的基本步骤1、服务器端创建ServerSocket,循环调用accept()等待客户端链接2、客户端创建一个Socket并请求和服务器端链接3、服务器端接受客户端请求,创建socekt与该客户端建立专线链接4、建立链接的socket在一个单独的线程上对话5、服务器继续等待新的链接服务器端Server.javapackage test.concurren...

weixin_42300956的博客 221

基于java服务端及android客户端的仿讯雷多线程下载技术实现_java多线程实现服务器端与多客户端之间的通信...

用java语言构建一个网络服务器,实现客户端和服务器之间通信,实现客户端拥有独立线程,互不干扰。应用多线程来实现服务器与多线程之间的通信的基本步骤服务器端创建ServerSocket,循环调用accept()等待客户端链接客户端创建一个Socket并请求和服务器端链接服务器端接受客户端请求,创建socekt与该客户端建立专线链接建立链接的socket在一个单独的线程上对话服务器继续等待新的链接服务...

weixin_42636895的博客 130
上一篇: 【线性表】栈:线性栈、动态线性栈、链式栈的基本特性
下一篇: 【Java多线程】第一个线程池程序
ALGO阿狗
博客等级 码龄9年 64粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值