多线程

Java多线程:Linux多路复用,Java NIO与Netty简述

蓝咒 提交于 2020-03-15 10:11:48
JVM的多路复用器实现原理 Linux 2.5以前:select/poll Linux 2.6以后: epoll Windows: Winsock的select模型(感谢评论指正,仅Java NIO.2使用了Windows IOCP,由于Netty没有采用NIO.2此处不展开) Free BSD, OS X: kqueue 下面仅讲解Linux的多路复用。 Linux中的IO Linux的IO将所有外部设备都看作文件来操作,与外部设备的操作都可以看做文件操作,其读写都使用内核提供的系统调用,内核会返回一个文件描述符(fd, file descriptor),例如socket读写使用socketfd。描述符是一个索引,指向内核中一个结构体,应用程序对文件的读写通过描述符完成。 一个基本的IO,涉及两个系统对象:调用这个IO进程的对象,系统内核,read操作发生时流程如下: 通过read系统调用向内核发起读请求。 内核向硬件发送读指令,并等待读就绪。 内核把将要读取的数据复制到描述符所指向的内核缓存区中。 将数据从内核缓存区拷贝到用户进程空间中。 Linux I/O模型简介 阻塞I/O模型:最常用,所有文件操作都是阻塞的。 非阻塞I/O模型:缓冲区无数据则返回,一般采用轮询的方式做状态检查。 I/O复用模型:详细见下 信号驱动I/O:使用信号回调应用,内核通知用户何时开启一个I/O操作

java学习——多线程

我的未来我决定 提交于 2020-03-15 05:47:52
本文内容来源于 历经5年锤练--史上最适合初学者入门的Java基础视频 线程:就是进程中一个负责程序执行的控制单元(执行路径) 每一个线程都有自己运行的内容。这个内容可以称为线程要执行的任务。 多线程好处:解决了多部分同时运行的问题。 多线程的弊端:线程太多回到效率的降低。 JVM启动时就启动了多个线程,至少有两个线程可以分析的出来。 1,执行main函数的线程, 该线程的任务代码都定义在main函数中。 2,负责垃圾回收的线程。 多线程状态图: 如何创建一个线程呢? 创建线程方式一:继承Thread类。 步骤: 1,定义一个类继承Thread类。 2,覆盖Thread类中的run方法。 3,直接创建Thread的子类对象创建线程。 4,调用start方法开启线程并调用线程的任务run方法执行。 class Demo extends Thread{   ......   public void run(){     ......   } } class ThreadDemo2 {   public static void main(String[] args) {      Demo d1 = new Demo();     d1.start();//开启线程,调用run方法。 } View Code 线程创建方式二:实现Runnable接口(比较常用) 步骤: 1

JavaSE---多线程---线程组

雨燕双飞 提交于 2020-03-15 03:56:07
1、概述       1.1  Java中 使用 ThreadGroup 表示 线程组 ,可以 对一批线程进行分类管理 ;       1.2  Java程序 可以 直接对 线程组 进行控制 (相当于 同时控制这组线程 );       1.3  用户 创建的所有线程 都属于 指定线程组,如果 程序没有显式指定 线程属于哪个线程组 ,则 该线程属于 默认线程组 ;             ( 默认情况下 , 子线程与父线程 位于同一个线程组中 [A线程中创建了B线程])       1.4   一旦线程加入某一组后 ,中途 将 不能改变 它所属的组,直到死亡 ;       1.5   ThreadGroup 内定义了一个有用的方法,用来 处理 该 线程组内 的线程 所抛出的 未处理的异常 :        public void uncaughtException(Thread t, Throwable e) { if (parent != null) { parent.uncaughtException(t, e); } else { Thread.UncaughtExceptionHandler ueh = Thread.getDefaultUncaughtExceptionHandler(); if (ueh != null) { ueh.uncaughtException

单例模式,多线程单例,双重锁定单例,工厂单例创建上下文。

限于喜欢 提交于 2020-03-15 03:55:38
单例子模式定义 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是让类自身负责保存它的唯一实例。这个类可以保证没有其它实例可以呗创建并且它可以提供一个访问该实例的方法,这就是单例模式。 单例子模式简单实现 Singleton类定义了一个GetInstance 操作,允许客户访问它的唯一实例,GetInstance是一个静态方法,主要负责创建自己的唯一实例。 public class Singleton { private static Singleton _instance; private Singleton()//私有化构造函数,阻止外界利用new关键词来创建实例 {} public static Singleton GetInstance() { return _instance ?? (_instance = new Singleton()); } } 测试代码 public void Myaction() { var s1 = Singleton.GetInstance(); var s2 = Singleton.GetInstance(); if (s1 == s2) { Console.WriteLine("两个对象是相同的!"); } Console.Read();

C# TCP多线程服务器示例

偶尔善良 提交于 2020-03-14 21:54:49
前言 之前一直很少接触多线程这块。这次项目中刚好用到了网络编程TCP这块,做一个服务端,需要使用到多线程,所以记录下过程。希望可以帮到自己的同时能给别人带来一点点收获~ 关于TCP的介绍就不多讲,神马经典的三次握手、四次握手,可以参考下面几篇博客学习了解: TCP三次握手扫盲 效果预览 客户端是一个门禁设备,主要是向服务端发送实时数据(200ms)。服务端解析出进出人数并打印显示。 实现步骤 因为主要是在服务器上监听各设备的连接请求以及回应并打印出入人数,所以界面我设计成这样: 可以在窗体事件中绑定本地IP,代码如下:        //获取本地的IP地址 string AddressIP = string.Empty; foreach (IPAddress _IPAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList) { if (_IPAddress.AddressFamily.ToString() == "InterNetwork") { AddressIP = _IPAddress.ToString(); } } //给IP控件赋值 txtIp.Text = AddressIP; 首先我们需要定义几个全局变量 Thread threadWatch = null; // 负责监听客户端连接请求的 线程;

to meet you Java多线程与并发

家住魔仙堡 提交于 2020-03-14 18:46:59
2: hotspot中对象在内存的布局是分3部分 对象头 实例数据 对其填充 这里主要讲对象头:一般而言synchronized使用的锁对象是存储在对象头里的,对象头是由Mark Word和Class Metadata Address组成 mark word存储自身运行时数据,是实现轻量级锁和偏向锁的关键,默认存储对象的hasCode、分代年龄、锁类型、锁标志位等信息。 由于对象头的信息是与对象定义的数据没有关系的额外存储成本,所以考虑到jvm的空间效率,mark word 被设计出一个非固定的存储结构,以便存储更多有效的数据,它会根据对象本身的状态复用自己的存储空间(轻量级锁和偏向锁是java6后对synchronized优化后新增加的) Monitor:每个Java对象天生就自带了一把看不见的锁,它叫内部锁或者Monitor锁(监视器锁)。上图的重量级锁的指针指向的就是Monitor的起始地址。 每个对象都存在一个Monitor与之关联,对象与其Monitor之间的关系存在多种实现方式,如Monitor可以和对象一起创建销毁、或当线程获取对象锁时自动生成,当线程获取锁时Monitor处于锁定状态。 Monitor是虚拟机源码里面用C++实现的 源码解读:_WaitSet 和_EntryList就是之前学的等待池和锁池,_owner是指向持有Monitor对象的线程

Java多线程 - 中断线程

为君一笑 提交于 2020-03-14 11:18:22
● 中断线程的三种方式 1,定于循环结束标记 因为线程运行代码一般都是循环,只要控制循环即可, 任务中都会有循环结构,只要控制住循环就可以结束任务。 控制循环通常就用定义标记来完成。 2,run方法结束 3,使用Interrupt(中断)方法 该方法是结束线程的冻结状态,使线程回到运行状态来。 方法将线程从冻结状态强制恢复到运行状态来,让线程具备cup的执行资格 当强制动作会发生时会抛InterruptException异常,记得要处理 一、中断线程 - interrupt   线程的 thread.interrupt() 方法是中断线程,将会设置该线程的中断状态位,即设置为 true,中断的结果线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序本身。线程会不时地检测这个中断标示位,以判断线程是否应该被中断(中断标示值是否为 true )。它并不像 stop 方法那样会中断一个正在运行的线程。 判断线程是否被中断   判断某个线程是否已被发送过中断请求,请使用Thread.currentThread().isInterrupted()方法(因为它将线程中断标示位设置为true后,不会立刻清除中断标示位,即不会将中断标设置为false),而不要使用thread.interrupted()(该方法调用后会将中断标示位清除,即重新设置为false)方法来判断

JAVA多线程 - 对象锁

谁说胖子不能爱 提交于 2020-03-14 01:51:53
多线程并发,给我们编程带来很多好处,完成更多更有效率的程序。但是也给我们带来线程安全问题。比如多个线程同时操作一个对象时,第一个线程没处理好,第二个线程就进来插一脚,影响了程序执行。为了每个线程被安全执行,需要引入一个对象锁的概念,也就是线程同步方法。    synchronized(Objecrt){你要同步的代码} 实例 模拟一个机票系统:有三个售票点,一天共同卖出2000张票。 1 /* 2 * 作者:白客C 3 * 时间:2020年03月13日 4 * 内容:线程锁实例 5 */ 6 7 package com.beekc.www; 8 9 public class Beekc{ 10 11 public static void main(String[] args) 12 { 13 //定义三个售票窗口 14 TicketWindow ticketWindow1 = new TicketWindow(); 15 //TicketWindow ticketWindow2 = new TicketWindow(); 16 //TicketWindow ticketWindow3 = new TicketWindow(); 17 18 //启动线程 19 Thread t1 = new Thread(ticketWindow1); 20 Thread t2 = new

多线程笔试面试概念问答

我的未来我决定 提交于 2020-03-13 17:30:45
题目转自http://blog.csdn.net/morewindows/article/details/7392749 第一题:线程的基本概念、线程的基本状态及状态之间的关系? 线程,有时称为轻量级进程,是CPU使用的基本单元;它由线程ID、程序计数器、寄存器集合和堆栈组成。它与属于同一进程的其他线程共享其代码段、数据段和其他操作系统资源(如打开文件和信号)。 线程有四种状态:新生状态、可运行状态、被阻塞状态、死亡状态。状态之间的转换如下图所示: 第二题:线程与进程的区别? 1、 线程是进程的一部分,所以线程有的时候被称为是轻权进程或者轻量级进程。 2、 一个没有线程的进程是可以被看作单线程的,如果一个进程内拥有多个进程,进程的执行过程不是一条线(线程)的,而是多条线(线程)共同完成的。 3、 系统在运行的时候会为每个进程分配不同的内存区域,但是不会为线程分配内存(线程所使用的资源是它所属的进程的资源),线程组只能共享资源。那就是说,出了CPU之外(线程在运行的时候要占用CPU资源),计算机内部的软硬件资源的分配与线程无关,线程只能共享它所属进程的资源。 4、 与进程的控制表PCB相似,线程也有自己的控制表TCB,但是TCB中所保存的线程状态比PCB表中少多了。 5、 进程是系统所有资源分配时候的一个基本单位,拥有一个完整的虚拟空间地址,并不依赖线程而独立存在。 第三题

2014广州Java岗位面试汇总

限于喜欢 提交于 2020-03-13 11:23:21
本文记录了最近一些朋友提供的面试经历,真实数据,仅供广州求职的朋友参考。为行文方便,一律用主语”我“进行。部分词语可能造成读者不良反应,敬请留意。 1 广州沣首信息科技有限公司 公司所在区域相对较偏,勤天厦大对面区域,一直往里走,有快走到底的感觉。 到公司,已有人在面,我被引到休息区等候。一姑娘倒来杯水,让我稍等。约10分钟后,到会议室面试。面试官并不关注技能点,而是一直问上一份工作的内容及离职原因。聊了不到5分钟,让我回去等消息,他会让用人部门进一步评估。至此,再无下文。 2 广州游众软件科技有限公司 公司在猎德大桥附近,春天里公寓A栋,沿用铁人公司的前办公场地,与上海芒果互娱科技有限公司共享部分股东。 到公司,前台给了份相关岗位的题目,两页纸,知识点分布在多线程、JVM、设计模式、Spring、ORM、MySQL优化等。答题在前台左边的走廊,那算是一个小休息区,同时有另一个比我早到的哥们也在答题。答题的同时,有几个开发出来抽烟闲聊,清洁阿姨拖着吸尘器走来走去,吵的一点想法都没了。我大约用了30分钟答完,除去ORM、Spring、SQL优化略写,其余一一详答。答卷交回前台,被告知到右边的沙发等候。 约3分钟,面试官到达战场。因同一楼层所有会议室被占用。面试官只好带我到17层的上海芒果互娱科技有限公司去借用场地。谁知,到17层后,会议室满。无奈,只好在前台旁边的沙发进行。