随笔分类 - Java 多线程
1
摘要:Future设计模式说明 Future 模式有点类似于商品订单。比如在网购时,当看重某一件商品事,就可以提交 订单,当订单处理完成后,在家里等待商品送货上门即可。或者说更形象的我们发送 Ajax 请求的时候,页面是异步的进行后台处理,用户无须一直等待请求的结果,可以继续浏览或 操作其他内容。 代码实
阅读全文
摘要:1、搭建框架 我们只是简单模拟,框架简单分三个模块 a,服务器端server包 b,servlet,根据不同的请求url,利用反射生产对应的servlet c,IO工具包,用来关闭IO流 d,编写web.xml e,写一个简单的html用于测试 f, IO工具包比比较简单,先写了: 2、编写xml文
阅读全文
摘要:我这边找了个小说网站: 基本套路: 第一步:获取小说每一章的url地址 第二步:获取章节url内容并使用正则表达式提取需要的内容 第三步:多线程封装,实现如下效果 最后测试。 代码: 内容获取封装: public class WebSpider { //<a href="/35/35971/1355
阅读全文
摘要:分析: 聊天室需要多个客户端和一个服务端。 服务端负责转发消息。 客户端可以发送消息、接收消息。 消息分类: 群聊消息:发送除自己外所有人 私聊消息:只发送@的人 系统消息:根据情况分只发送个人和其他人 技术方面: 客户端和服务端收发消息,需要使用IO流,封装一个IOUtils工具类用来释放资源。
阅读全文
摘要:Java TCP的基本操作参考前一篇:Java 网络编程 – 基于TCP实现文件上传 实现多用户操作之前先实现以下单用户操作,假设目前有一个用户: 账号:zs 密码:123 服务端: public class LoginServer { public static void main(String[
阅读全文
摘要:Java TCP 操作基本流程 一、创建服务器 1、指定端口, 使用serverSocket创建服务器 2、阻塞式连接 accept 3、操作:输入流 输出流 4、释放资源 二、创建客户端 1、使用Socket 创建客户端 + 服务器的ip和端口 2、操作:输入流 输出流 3、释放资源 实现文件上传
阅读全文
摘要:UDP 基本流程: UDP发送端基本流程: 1、使用DatagramSocket 指定端口 创建发送端 2、准备数据 一定转成字节数组 3、 封装成DatagramPacket 包裹,需要指定目的地 4、发送包裹send(DatagramPacket p) * 5、释放资源 UDP接收端基本流程:
阅读全文
摘要:JDK提供的大多数内置锁都是可重入的,也就是 说,如果某个线程试图获取一个已经由它自己持有的锁时,那么这个请求会立 刻成功,并且会将这个锁的计数值加1,而当线程退出同步代码块时,计数器 将会递减,当计数值等于0时,锁释放。如果没有可重入锁的支持,在第二次 企图获得锁时将会进入死锁状态。 现实中,我们
阅读全文
摘要:在 多线程中,每个线程会把数据从主内存中拷贝到自己的工作内存中,当线程完成计算后,再把工作内存的数据更新到主内存中,或者当主内存主数据有更新是,线程会去主内存取最新数据。但是,当线程特别忙时,就不会去主内存读最新数据了。 在 java 的多线程中 volatile 主要是为了保证数据的可见性同步,是
阅读全文
摘要:指令重排是指:代码执行顺序和预期不一致。 代码运行一般步骤为: 1、从内存中获取指令解码 2、计算值 3、执行代码操作 4、把结果写回内存 而写回内存的操作比较耗时,CPU为了性能,可能不会等它完成,就进行对下一个指令解码计算。 发生指令重排是CPU为了提高性能,但必须是对结果不影响的情况,比如:
阅读全文
摘要:使用信号灯法实现生产消费者模式需要借助标志位。 下面以演员表演,观众观看电视为列,写一个demo 同一资源 电视: //同一资源 电视 class Tv { String voice; // 信号灯 // T 表示演员表演 观众等待 // F 表示观众观看 演员等待 boolean flag = t
阅读全文
摘要:多线程通过管程法实现生产消费者模式需要借助中间容器作为换从区,还包括生产者、消费者。下面以蒸馒头为列,写一个demo。 中间容器: 为了防止数据错乱,还需要给生产和消费方法加锁 并且生产者在容器写满的情况下需要等待消费者消费, 同理消费者在容器为空的情况下需要等待生产者生产 //缓冲区 class
阅读全文
摘要:在java 多线程中 过多的同步造成相互不释放资源 从而相互等待,造成死锁线现象,一般发生于同步中持有多个对象锁 如以下代码: public class DeadLock { public static void main(String[] args) { WuDao wd1 = new WuDao
阅读全文
摘要:先看一个经典的12306案例: public class SynBlockTest { public static void main(String[] args) { // 一份资源 SynWeb12306 web = new SynWeb12306(); // 多份代理 new Thread(w
阅读全文
摘要:jdk 8 开始 java 引入了lambda 表达式。 lambda适用场景: 1、接口或父类 2、接口或父类只有一个方法 我们从多线程写法来推导一下: 1、外部类写法: package com.xzlf.thread; /** * Lambda 表达式推导一:外部类 * @author xzlf
阅读全文
摘要:我们使用 java 多线程时,都需要通过线程代理对象来启动线程,常见的写法: new Thread(target).start(); 这在设计模式中叫静态代理模式,静态代理模式组成; 1、公共接口 2、真实角色 3、代理角色 以结婚为例,结婚要找婚庆公司,结婚前和结婚后的事情交给婚庆公司处理,你只要
阅读全文
摘要:完整套路 java 通过实现Callable 接口来实现多线程相比较于继承Thread 接口和 实现Runnable 接口比较麻烦,但好处是可以有返回值。 基本套路: 1. 创建目标对象 2. 创建执行服务 3. 提交执行 4. 获取结果 5. 关闭服务 6. 继续方式一的下载图片,改写一下: 1
阅读全文
摘要:由于java是单继承,很多时候为了实现多线程 通过继承 Thread 类后,就不能再继承其他类了。为了方便可以通过实现 Runnable 接口来实现,和Tread 类似需要重写run 方法。 下面通过模拟12306 黄牛抢票来简单应用: public class Web12306 implement
阅读全文
摘要:java 通过继承Thread类实现多线程很多简单: 只需要重写run方法即可。 比如我们分三个线程去京东下载三张图片: 1、先写个下载类: 注意导入CommonsIO 包 public class WebDownLoad { public void download(String url, Str
阅读全文
摘要:RandomAccessFile 相对其它流多了一个seek() 方法指定指针的偏移量。 1、指定起始位置读取剩余内容 public static void test01() throws IOException { RandomAccessFile raf = new RandomAccessFi
阅读全文
1