多线程

四十二,Java 网络编程浅析

时光怂恿深爱的人放手 提交于 2021-02-19 04:59:12
1. 网络编程的基本概念 网络编程使物理上不在一起的主机进行互联 , 网络连接过程需要使用网络协议 , 常见的通信协议是 TCP,UDP 协议 . TCP: 属于可靠的连接 , 使用三方握手的方式完成连接的确认 . UDP: 属于不可靠的连接 . 对于网络的开发有两种架构 :C/S 和 B/S. 2. 简单 TCP 程序实现 网络开发包所在的类都在 java.net 开发包中 . 此包中可以使用 ServerSocket,Socket 类完成服务器和客户端的开发 . 开发 TCP 程序 , 首先开发服务器端 , 使用 ServerSocket 进行客户端的连接接收 , 每个客户端在程序上都使用 Socket 对象表示 . Server 代码 : package com.ares.demo.helloserver; import java.io.OutputStream; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; public class HelloServer { public static void main(String[] args) throws Exception { ServerSocket server = new ServerSocket

java 多线程入门

﹥>﹥吖頭↗ 提交于 2021-01-11 03:35:06
1,实现Runnable接口的类(new Thread(subRunnalbe)),在同时new该类的多个实例时,是同一实例(Runnable实例)的多个线程。而继承Thread类的线程,每次new的都是新的thread实例。 2, start()方法最本质的功能是从CPU中申请另一个线程空间来执行 run()方法中的代码,它和当前的线程是两条线,在相对独立的线程空间运行,调用start()方法后,run()方法的代码会和当前线程并发(单CPU)或并行 (多CPU)执行。 3, 对象调用interrupt()方法,它对应的线程并没有被中断,只是改变了它的中断状态。只有当线程执行到sleep,wait,join等方法时,或者自己检查中断状态而抛出异常的情况下,线程才会抛出异常。 4,interrupted()方法是一个static方法,就是说只能在当前线程上调用,是说中断的状态已经结束(到非中断状态了),不仅检查当前线程 是否为中断状态,而且在保证当 前线程回来非中断状态 5,isInterrupted()方法则仅仅检查线 程对象对应的线程是否是中断状态,并不改变它的状态。 6,sleep()方法中是类方法,也就是对当前线程而言的。 7,join()方法,正如第一节所言,在一个线程对象上调用join方法,是当前线程等待这个线程对象对应的线程结束,比如有两个工作,工作A要耗时10秒钟

【翻译】Understanding SynchronizationContext

浪子不回头ぞ 提交于 2021-01-07 08:38:01
原文: http://www.codeproject.com/Articles/31971/Understanding-SynchronizationContext-Part-I 理解 SynchronizationContext SynchronizationContext - MSDN Lets You Down 我也不知道为什么,但实际上事实就是这样——.NET框架中没有太多的对这个类描述。MSDN文档也只有少量的关于如何使用SynchronizationContext的信息。我必须说, 为了理解和学习如何使用它 ,我经历了一段痛苦的时间。通过阅读大量的相关文章,我终于理解了这个类的意图以及怎么正确的使用它。现在,我决定把写下这偏文章 ,不管它能不能帮助到你。 Using SynchronizationContext to Marshal Code from One Thread to Another Let's get some technical points out of the way so we can show how to use this class,通过SynchronizationContext,可以使两个线程之间通信。假设现在有 2个线程,Thread1 和 Thread2。Thread1 正在工作,现在Thread1 想让Thread2执行一段代码

Condition.await, signal 与 Object.wait, notify 的区别

半城伤御伤魂 提交于 2020-12-31 12:01:27
Object 类中 wait,notify 与 notifyAll 方法可以用来实现线程之间的调度,比如在阻塞队列(BlockingQueue)的实现中,如果队列为空,则所有消费者线程进行阻塞 ( wait ),如果某一个时刻队列中新添加了一个元素,则需要唤醒某个或所有阻塞状态的消费者线程( notify,notifyAll ),同理如果是队列已满,则所有生产者线程都需要阻塞,等到某个元素被消费之后又需要唤醒某个或所有正在阻塞的生产者线程 Condition 的 await,signal, singalAll 与 Object 的 wait, notify, notifyAll 都可以实现的需求,两者在使用上也是非常类似,都需要先获取某个锁之后才能调用,而不同的是 Object wait,notify 对应的是 synchronized 方式的锁,Condition await,singal 则对应的是 ReentrantLock (实现 Lock 接口的锁对象)对应的锁 来看下面具体的示例:使用 wait, notify 和 await, signal 方式分别实现一个简单的队列 public interface SimpleQueueDemo<E> { void put(E e); E take(); } 基于 Object wait, notify 的实现 public

java的锁机制

本小妞迷上赌 提交于 2020-12-08 08:32:40
一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的 权限,在java里边就是拿到某个同步对象的锁(一个对象只有一把锁); 如果这个时候同步对象的锁被其他线程拿走了,他(这个线程)就只能等了(线程阻 塞在锁池等待队列中)。 取到锁后,他就开始执行同步代码(被synchronized修饰的代码);线程执行完同步代码后马上就把锁还给同步对象,其他 在锁池中等待的某个线程就可以拿到锁执行同步代码了。这样就保证了同步代码在统一时刻只有一个线程在执行。 众所周知,在Java多线程编程中,一个非常重要的方面就是线程的同步问题。 关于线程的同步,一般有以下解决方法: 1. 在需要同步的方法的方法签名中加入synchronized关键字。 2. 使用synchronized块对需要进行同步的代码段进行同步。 3. 使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象。 另外,为了解决多个线程对同一变量进行访问时可能发生的安全性问题,我们不仅可以采用同步机制,更可以通过JDK 1.2中加入的ThreadLocal来保证更好的并发性。 本篇中,将详细的讨论Java多线程同步机制,并对ThreadLocal做出探讨。 大致的目录结构如下: 一、线程的先来后到——问题的提出:为什么要有多线程同步?Java多线程同步的机制是什么? 二

Java:多线程死锁

限于喜欢 提交于 2020-11-21 15:17:55
死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。 产生死锁的原因: 1.因为系统资源不足。 2.进程运行推进的顺序不合适。 3.资源分配不当。 产生死锁的条件: 互斥条件:所谓互斥就是进程在某一时间内独占资源。 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。 简单的来说:死锁就是因为多线程在访问对象的时候,A线程占用了对象object1,又想去占用对象object2,但是此时的object2对象已经被B线程占用,并且B线程又想去占用object2。两个线程同时占用对方想要的对象,但是又不释放自己占有的对象,两个线程互相等待,造成拥塞无法执行下去。 public class LockDemo implements Runnable { private static Object object1 = new Object(); private static Object object2 = new Object(); private int flag = 0; public static void main(String[] args) { LockDemo run0 =

linux多线程网页截图-shell

我与影子孤独终老i 提交于 2020-05-08 09:20:46
老大临时安排任务,要定期对大量(万为单位)的网站截图并归档保存。最早使用的是window下的一个解决方案:webshotcmd.exe+批处理。 运行了一段时间,发现经常弹出webshotcmd.exe程序未响应的窗口,需要人工点击确定后才能继续截图,而且webshocmd未注册版本截出的 图是灰色的,不方便查看。 google了下,发现了linux的两个截图工具cutycapt和phantomjs,经过测试,cutycapt截图较慢,但比较稳定,phantomjs截图速度较快,但时有出现进程假死的情况。权衡利弊,决定使用cutycapt+shell脚本的方式截图: webshot.sh #/bin/bash #webhsot #by caishzh 2013 WEBSHOTDIR="/data/webshot" mkdir -p $WEBSHOTDIR while read LINE do DISPLAY=:0 cutycapt --url=http://$LINE --max-wait=90000 --out=$WEBSHOTDIR/$LINE.jpg >/dev/null 2>&1 done<domain.txt 脚本很简单,就不注释了,domain.txt是网址列表。 cutycapt的安装和使用参照这里 。 执行脚本,可以正常截图,图片质量也很高。但另一个问题出现了

多进程 VS 多线程 VS 线程池 VS EventLoop

天涯浪子 提交于 2020-04-30 19:58:16
多进程 VS 多线程 VS 线程池 VS EventLoop 在现在的编程过程中,经常听到多进程,多线程,线程池,EventLoop 的概念,选择一个正确的驱动模型,有助于提升代码的性能。 注:本文仅仅讨论并发的情况。 进程和线程 进程:操作系统中 资源管理对象 ,管理虚拟内存,文件句柄,线程等资源,但是 进程不是执行单元 。 线程: 具体的执行单元 。CPU是实际的物理执行单元,通过 寄存器 可以控制CPU执行的代码以及状态。而线程就是包含了一个任务的CPU上下文(寄存器),任务状态(就绪|阻塞|运行),所属用户等信息的对象。操作系统接收到时间中断(INT)后, 通过轮转线程中的CPU上下文(寄存器)信息,实现了多任务的轮转 。 多进程 多进程:针对并发请求,一个请求开启一个进程进行处理。早起CGI就是这么干的。 代表:早期PHP,CGI类 优点: 一个业务进程奔溃不影响另外一个业务进程,从操作系统层面上隔离业务执行 如果进程采用Socket之类的RPC调用,那么非常容易部署到网络环境上 缺点: RPC调用比较难以编写 频繁的开启和关闭进程,性能比较差 不允许内存共享(排除内核支持情况) 多线程 多线程:针对不同的业务逻辑,并发的开启多个线程进行执行。 代表:早期 Tomcat Bio模型 优点: 内存是共享的 编写并发模型比较方便 有效的利用多核CPU 缺点: 并发量过大的时候

java-多线程-一道阿里面试题分析

爱⌒轻易说出口 提交于 2020-04-29 18:00:53
传说这是阿里的一道面试题: 也传说发这道题出来的作者去了tmail。下面是关于题目的描述: 这段代码大多数情况下运行正常,但是某些情况下会出问题。什么时候会出现什么问题?如何修正?可见博客 http://yueyemaitian.iteye.com/blog/1387901 Java代码 public class MyStack { private List<String> list = new ArrayList<String>(); public synchronized void push(String value) { synchronized ( this ) { list.add(value); notify(); } } public synchronized String pop() throws InterruptedException { synchronized ( this ) { if (list.size() <= 0 ) { wait(); } return list.remove(list.size() - 1 ); } } } 下面是关于这道题的分析: list.remove(list.size() - 1);这句代码有可能引发数组下标越界 原因: 假设其中一种情形呵!出问题的情形可能很多,但原理都差不多。下面的标号代表程序时序的先后顺序。 1

Linux 多线程应用中编写安全的信号处理函数

本小妞迷上赌 提交于 2020-04-26 22:35:42
Linux 多线程应用中编写安全的信号处理函数 在 开发多线程应用时,开发人员一般都会考虑线程安全,会使用 pthread_mutex 去保护全局变量。如果应用中使用了信号,而且信号的产生不是因为 程序运行出错,而是程序逻辑需要,譬如 SIGUSR1、SIGRTMIN 等,信号在被处理后应用程序还将正常运行。在编写这类信号处理函数时,应用层面的开发人员却往往忽略了信号处理函数执行的上下文背景,没有考虑编写安全的 信号处理函数的一些规则。本文首先介绍编写信号处理函数时需要考虑的一些规则;然后举例说明在多线程应用中如何构建模型让因为程序逻辑需要而产生的异步信 号在指定的线程中以同步的方式处理。 回页首 线程和信号 Linux 多线程应用中,每个线程可以通过调用 pthread_sigmask() 设置本线程的信号掩码。一般情况下,被阻塞的信号将不能中断此线程的执行,除 非此信号的产生是因为程序运行出错如 SIGSEGV;另外不能被忽略处理的信号 SIGKILL 和 SIGSTOP 也无法被阻塞。 当一个线程调用 pthread_create() 创建新的线程时,此线程的信号掩码会被新创建的线程继承。 POSIX.1 标准定义了一系列线程函数的接口,即 POSIX threads(Pthreads)。Linux C 库提供了两种关于线程的实现:LinuxThreads 和 NPTL