A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小石姐姐 于 2018-4-24 17:18 编辑

JAVA多线程

        进程:正在进行的程序,一个应用程序在内存中的执行区域,一个进程至少要有一个线程
        线程:进程中的一个负责程序执行的控制单元(执行路径),一个进程中可以多执行路径,称为多线程
        单线程特点:安全性高,效率低
        多线程特点:安全性低,效率高。本质为CPU处理器在多个线程之间快速切换 ,达到同时运行的效果
        java创建线程的方式
                1、定义一个类 继承 Thread类,重写父类的run()方法
                        启动执行线程,Java虚拟机调用该线程的run方法
                        该类对象.start()
                2、定义一个类 实现 Runable接口,重写接口的run()方法。(常用)
                        new Thread(该类对象).start()        //执行线程
                        好处:将线程的任务从线程的子类中分离出来,进行单独封装。避免java单继承局限性
                3、线程池(thread pool),存放Thread对象的池子
                        1. 定义类 实现 Callable接口,重写call() 方法(返回结果为传入的泛型)。传入线程池执行
                        2. 定义类 实现 Runnable接口,重写run() 方法。传入线程池执行
        Thread 类
                --构造方法
               (Runable target)        通过Runable对象那个创建Thread对象      
                (Runable target,String threadName)        指定线程名

                --静态成员
                sleep(long millis)                //指定时间内睡眠,时间结束后继续执行。不释放锁。可能抛 InterruptedException
                Thread currentThread()        //返回当前运行线程的引用
                yield()        //暂停一下当前执行线程对象,释放执行权
               --成员方法
                run()                //用于子类重写,表示该线程要执行的任务,不能直接调用

                start()                //执行线程
                setName()        //修改线程名称
                String getName()//返回线程的名称
                setDacmon(true)        //将该线程标记为守护线程或用户线程,成为后台线程,不会因为前台线程结束而消失
                join()                //临时加入一个线程运算时可以用,哪个线程执行到该方法哪个线程等待该线程终止。可能抛出中断异常
                toString()        //返回 线程名、优先级1-10越高越优、线程组
                setPriority(MAX_PRIORITY)        //设置优先级,默认为5
                结束线程
                        控制run方法任务结束,控制循环,定义标记,如果线程处于冻结状态,无法读取
                        interrupt()        //将线程从冻结状态强制恢复到运行状态中来,让线程具备cpu执行资格,但会抛出中断异常 InterruptedException
        Executors 类
                静态方法
                        ExecutorService newCachedThreadPool()        //创建一个新线程池,为每个新传入的任务创建一个线程
                        ExecutorService newFixedThreadPool(int nThreads) //创建一个固定数量的线程池(常用)
                        ExecutorService newSingleThreadExecutor() //创建只有一个线程的线程池
        ExecutorService 类
                Future<T> submit(Callable<T> task)        提交线程并执行, 返回结果
                Future<T> submit(Runnable task)                同上, 只是参数不同
                Future<T> submit(Runnable task,T)        传入任意类型结果,不传则返回的是null
                shutdown()        通知线程执行完任务后关闭. 注意该方法不会在调用时立刻停止线程, 而是让线程执行完任务后停止. 如果不调用此方法, 则线程任务执行完后仍然在运行
        Future
                get()        //返回结果
        线程安全问题
                出现原因:多个线程并发的访问共享的数据
                同步:安全性高,效率低;非同步:效率高,安全性低
                解决1、同步代码块。建议使用,锁对象需要被所有的线程共享,保证对象引用是同一个
                        synchronized(锁对象){ 操作共享数据的代码 }
                解决2、同步方法。此方法只可同时被一个吸线程执行
                        synchronized修饰方法。
                        非静态同步方法锁对象为this
                        静态同步方法锁对象为当前类的字节码对象
                解决3:
                        Lock l=new ReentrantLock();        //创建锁对象,替代了synchronized关键字
                                l.lock();        //获取锁
                                try{code...}finally{l.unlock();}        //释放锁
                                Condition l.newCondition();                //通过已有锁获取该锁上的监视器对象,可创多个
                                        await();        //冻结线程
                                        signal();        //唤醒线程池中一个线程
                                        signalAll();//唤醒线程池中所有线程
                        Condition        //替代了Object监视器方法的使用
                        
                死锁(deadlock)同步代码块中的线程不出来, 也不释放锁; 同步代码块外的线程拿不到锁, 只能等在外面
                        发生死锁的原因:
                                1. 同步代码块内的线程, 可能处在死循环, IO阻塞, sleep()状态, 导致内部持有锁的线程无法出同步代码块
                                2. 多个线程互相持有锁又不释放锁: 两个线程执行的任务都是双层同步代码块, 每层同步都需要一个锁, 两个线程中同步代码块的锁是相反的
        线程的声明周期中有5种状态
                1. 创建: new一个线程对象, 此时还没有调用start()
                2. 就绪: 调用start()方法后, 进入就绪状态, 等待CPU执行
                3. 运行: 获取了CPU的执行权, 开始运行线程。
                4. 阻塞: (冻结)调用了sleep(), wait(),或由于IO操作导致阻塞. 阻塞解除后仍会返回就绪状态, 等待CPU执行
                5. 销毁: (消亡)线程执行完毕。
        
        线程间通讯
                线程释放锁的3种情况
                        1. synchronized同步代码执行完毕
                        2. 线程发生了异常导致线程终止
                        3. 线程调用了 wait() 方法进行等待, 等待会立刻释放锁
                等待/唤醒机制。锁对象就是监视器
                Object 类。这些方法用于锁对象调用
                        wait()        //使当前线程等待状态。释放执行权,立刻释放锁。可能抛 InterruptedException。让线程处于冻结状态,线程会被存储到锁的线程池中。
                        notify()        //随机唤醒此对象监视器上等待状态的线程
                        notifyAll()        //唤醒此对象监视器上等待状态的所有线程
                        都必须定义在同步中,因为这些方法是用于操作线程状态的方法,必须明确操作的是哪个锁上的线程
        
网络编程

        网络编程:又称Socket(套接字)编程
        Socket (套接字)不是协议, 而是对协议的封装, 提供了编程规范接口, 让程序员可以通过它来实现相关网络协议
                用于描述IP地址和端口. 是一种网络编程机制. 通信两端都有Socket
                计算机上一般会有多个服务程序, 每个服务程序会使用多个Socket进行网络通信, 每个Socket会绑定到一个端口上, 网络通信就是Socket之间的通信, 数据在两个Socket之间通过IO流传输。
        |--操作IP地址的类
        InetAddress 类。IP地址,可包含相应主机名。无构造函数
                静态方法
                        InetAddress   getLocalHost()        //获取本地主机IP对象
                        InetAddress   getByName(String host)        //通过主机名 获取IP地址
                        InetAddress[] getAllByName(String host)        //通过主机名 获取IP地址。因为可能出现服务器集群,返回IP不唯一。
                        InetAddress   getByAddress(byte[] addr) //根据IP获取InetAddress对象
                        InetAddress   getLoopbackAddress()                 //获取回环地址的InetAddress对象. 即 127.0.0.1 或localhost
                String getHostAddress()        //获取IP地址字符串表示形式

                String getHostName()        //获取主机名称。没有返回主机地址
                byte[] getAddress()                //获取对象原始IP地址
        
        |--UDP传输
        步骤:建立发送端、接收端、数据包;调用Socket发送接收方法;关闭Socket;发送端与接收端是两个独立的运行程序。
        DatagramSocket 类        //发送和接收数据报包的套接字。基于UDP协议的Socket。随机分配端口号。
                (int port)                        //指定端口号,如果被占用可能抛BindException        端口号已经被绑定异常
                send(DatagramPacket p)                //发送数据包。从此套接字发送数据报包
                receive(DatagramPacket p)        //接收数据包。阻塞方法。从此套接字接收数据报包
                close()                                //关闭Socket通信,释放资源
        DatagramPacket 类         //UDP数据包
                发送
                (byte[],int len,InetAddress,int port)        //构造数据包,用来将指定长度的包发送到指定主机上的指定端口号
                接收,获取数据
                (byte[],int len)        //构造接收指定长度的数据包
                InetAddress getAddress()        //获取发送端IP对象
                byte[] getData()        //获取接收到的数据,也可以使用创建包对象时的数组
                int    getLength()        //获取具体接收到的数据长度,字节个数
                int    getPort()        //获取发送端的DatagramSocket端口号
        
        |--TCP传输
                过程:建立客户端和服务器端,通过Socket中的IO流进行数据传输。关闭socket。客户端与服务器端是两个独立的应用程序。
        客户端建立,发送数据
                1、创建TCP客户端socket服务。使用Socket对象。指定明确其目的地、要连接的主机
                2、如果连接成功,说明数据传输通道以建立。该通道是socket流
                3、使用输出流,将数据写出
                4、关闭资源
        Socket 类        客户端。套接字是两台机器间通信的端点。
                (InetAddress,int port)        //创建一个流套接字并将其连接到指定IP指定端口。
                (String host,int port)        //创建一个流套接字并将其连接到指定主机上指定端口。
                发送,写入
                OutputStream getOutputStream()        //返回此套接字的输出流
                shutdownInput()                //输入结束标记。
                接收,读取
                InputStream getInputStream()        //返回此套接字的输入流
                InetAddress getInetAddress()        //获取发送端IP对象
                其他
                close()                //关闭连接,包括关闭流
        建立服务端,接收数据
                创建服务端Socket对象,通过ServerSocket对象
                服务端必须对外提供一个端口,否则客户端无法连接
                监听(阻塞),获取链接过来的客户端对象,
                用客户端对象的socket流读取客户端发来的数据
                关闭资源。关客户端,关服务端
        ServerSocket(int port) 类。        服务端。创建客户端对象,指定端口号
                Socket accept()        //监听数据,阻塞。获取客户端对象,通过获取IO流交互数据
                close()                        //关闭
               
               
反射

——反射(reflect)。在程序运行时,动态获取类中信息,就是java反射
        作用:在运行时,可以获取并调用任意一个类的所有方法和属性,反射可以在不修改源代码前提下,改变程序的运行方式;
                反射使后期web框架的底层实现基础
        前提:获取类的对象(Class<T> )
                1、对象名.getClass()
                2、类名.class
                3、Class.forName("全类名")
        Class<T> 类。描述字节码文件的类
                静态方法
                        Class<?> forName(String 全类名)        //获取class字节码文件对象
                String getName()        //返回全类名
                创建类的无参实例
                T newInstance();        //返回字节码文件类对应空参数的新实例
                获取构造
                Constructor<?>[] getConstructors()        //获取所有public的构造函数对象,没有返回数组长度为0
                Constructor<?>[] getDeclaredConstructors()        //获取所有权限的构造函数对象,如果该类是接口,基本类型,数组,void 则返回数组长度为0
                Constructor<T>   getConstructor(Class<?>... parameterTypes)        //根据指定参数获取public构造函数对象。需传入类型的字节码Class对象。如:(String.class,int.class)
                Constructor<T>   getDeclaredConstructor(Class<?>... parameterTypes)        //根据指定参数获取所有权限构造函数对象。
                获取变量字段
                Field[] getFields()                                //获取所有public字段对象
                Field[] getDeclaredFields()                //获取所有权限字段对象。
                Field   getField(String fieldName)                        //根据字段名称获取public的字段对象
                Field   getDeclaredField(String fieldName)        //根据字段名称获取任意权限的字段对象
                获取方法对象
                Method[] getMethods()                        //获取所有public的方法
                Method[] getDeclaredMethods()        //获取所有任意权限的方法
                Method          getMethod(String name,Class... parameterTypes)        //获取指定方法名的public方法,可以明确参数类型
                Method          getDeclaredMethod(String name,Class... parameterTypes)        //获取指定方法名的任意权限方法,可以明确参数类型
                注意:
                        方法名中包含Declared:可以获取任意权限的成员
                                对于 private修饰的 变量|方法 只能获取,不可访问和修改,可以取消java访问检查
                        方法名中不包含Declared:只能获取public修饰的成员
        
        Constructor<T>        //构造函数对象
                T newInstance(Object... initargs)        //指定参数创建实例,传入参数必须根指定的构造函数对象一致。否则抛异常
        Field        //字段对象。通过此对象修改(覆盖)指定对象的字段值
                Object get(Object obj)                        //获取指定对象字段值
                set(Object obj,Object value)        //设置指定对象字段值
        Method        //方法对象
                Object invoke(Object obj,Object... args)        //调用指定方法名[指定参数]的方法运行,没有返回值,返回null
        
               
HTML

——概述
        HTML(Hyper Text Markup Language) 超文本标记语言。
                标记语言:通过一组标签形式描述事物的一门语言
                超文本:比普通文本更强大
        作用:制作页面(静态页面),数据显示的描述。
        
        ——语法
        HTML文件后缀:.html|.htm
        书写规则:
                标签必须用<>引起来,已经定义好的标签
                属性 key="value" (建议属性值用双引号引起来)
                不区分大小写
        
        元素通用属性
                class        元素类名
                id                元素唯一ID
                style        元素样式
                title        元素额外信息        
               
                常见属性
                color:字体颜色
                        颜色取值
                                1.#xxxxxx|#xxx(x为3个16进制数,RGB,光的三原色)
                                2.英文单词
                align:对齐方式 left|right|center
                width=""        像素:1px         百分比:20%
                height=""
                border="px"        边框
                bgcolor                背景颜色
               
        路径写法
                相对路径:
                        ./ 或者 什么都不写        当前目录
                        ../                                        上一级目录
                绝对路径:
                        http://www.b.com          带协议的绝对路径
        
        <!-- 注释内容 -->        
        //版本声明
        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">        //html4标准
        <!doctype html>                //html5标准
        
        <html>        //根标签
                xmlns="http://url"默认命名空间
               
                <head lang="en">        //头标签,头部分,语言
                        <meta>        元信息标签
                                charset        //指定浏览器用什么编码打开此页面(默认UTF-8) big5繁体中文
                                name        //网页的描述信息。当取keywords时,content属性内容作为搜索引擎关键字搜索
                                http-equiv="Content-Type"        //模拟http协议的响应消息头
                                如:<meta http-equiv="refresh" content="3;url=http://www.baidu.com" />        //表示打开此页面三秒后打开百度
                        <title>标题</title>
                        <base>
                                href        //指定网页中所有超链接的目录,结尾处/表示
                                target        //指定所有超链接打开方式,如_blank
                        <link>        资源引用
                                rel="stylesheet"        //描述目标文件与当前文档的关系,外部样式表
                                type="text/css"         //文档类型
                                media        //指定目标文档在哪种设备上起作用
                                如:<link rel="stylesheet" type="text/css" media="screen,print" href=".css">
                        <style type="text/css">        定义样式,引入文档类型
                </head>
        
                <body>        体标签 </body>


        </html>        


        ——体标签
        <font>文字</font>        //字体标签
                face="黑体"(字体样式)
                size="(1-7字号)"
        
        排版标签
        <h1>...<h6>                //标题标签。换行,留白,加粗
        <p>                                //段落标签,前后空行
        <hr/>                        //水平分隔线
        <br/>                        //换行
        <center>                //内容居中显示
        <b>        粗体|<i>斜体|<u>下划线
        <big>大号字|<small>小号字|<ins>插入字
        <sup>上标|<sub>下标
        <del>|<s>                //删除线,更具语义化
                cite 删除原因
                datetime 删除时间
        <em>                        //强调
        <strong>                //重点强调,加粗


        <img src="图片源"/>        //图片标签
                alt=""                 图片找不到显示此内容
                title=""         鼠标移上显示此内容
                usemap="#Map"
        <map>        //图片部分加链接,可加多个区域
                <area shape="rect" coords="50,59,116,104" href="" />
        
        //列表标签
        <ol>        //有序列表。默认1.2.3.
                type="1"        默认。(a,A,i 罗马字符,I 大写罗马字符)
                start="10"        从10开始
                <li>        //列表项,缩进
        <ul>        //无序列表。
                type="disc"        //默认,实心原点(circle空心原点,square实心正方形)
                <li>        //缩进
        <dl>        //自定义列表。
                <dt>        //上层项目标签。
                        <dd>//缩进
                        
                        
        //超链接。链接资源
        <a></a>        
                href=""        //""默认指向当前文件目录。如果不指定任何协议,按照默认协议file://解析。#表示当前页面
                        javascript:void(0)        //javascript协议解析,取消超链接的默认点击效果
                        mailto:邮件地址                //找邮件程序解析,调用本机发邮件工具
                        thunder://路径加密        //迅雷自定义协议,对路径加密,点击后去注册表查找相关程序并解密打开地址下载资源               
                        图片路径                        //点开后显示图片
                target="_self"        //默认,当前页面打开
                        _blank        新页面打开
                        _parent        对于iframe在父页面打开
                        _top        对于iframe在最父级页面打开
                        框架名        打开到指定框架显示
        <a name=top></a>        //定位标记,锚。定义一个位置
        <a href="#top"></a>        //回到定义的位置
        
        //表格
        <table>                //表格
                cellpadding        文字边距
                cellspacing        单元格间距
                <tbody>        //不定义也存在,可省略
                        <caption>        //表格标题,居中
                        <tr>                //行
                                <th>        //表头单元格,加粗居中
                                <td>        //单元格
                                        colspan=""        //占的列数,跨列合并
                                        rowspan=""        //占的行数,跨行合并
        
        //表单标签
        <form>
                action="url?name=chen"        //指定提交路径并且get提交数据,不写默认提交到本页面
                method="get|post"                //提交方式,默认get,不只有这两种
                enctype="application/..."         以键值对的形式发送请求报文
                        multipart/...                        用于传送文件流
                <input />        表单输入
                        type="text" //文本框        属性maxlength
                                password//密码框
                                radio        //单选按钮,需指定value属性用于提交
                                checkbox//多选按钮,需指定value属性用于提交。如果name一样,会提交多个
                                button        //普通按钮。无任何功能
                                reset        //重置按钮。还原表单初始状态
                                submit        //提交按钮。
                                file        //文件框。value返回选择文件的路径
                                hidden        //隐藏字段。页面上不显示,但会提交到服务器
                                image        //图片提交按钮,图片作为按钮
                                        src="图片路径"
                        name
                                必须有name属性才可以提交至服务器
                                可以将几个单选框(复选框)设置为一组,name属性相同即可
                        value=""                //文本框默认值、按钮名称
                        size=""                        //文本框的长度
                        maxlength=""        //输入的最大长度
                        placeholder=""        //用于文本框灰化提示内容,提示内容不会提交至服务器
                        disabled="disabled"        //禁用此元素,不会提交
                        readonly="readonly"        //只读文本框
                <select name="">        下拉框,需指定value属性用于提交
                        size=""                        行数
                        multiple=true        成为多选列表框
                        <option value="">
                                selected="selected"        //默认选中此项
                <textarea name=""  cols=""  rows="" >        文本域
                提交至服务器内容格式
                        URL?key=value&key2=vlaue2&...
                        文本框、密码框、文本域 手写内容直接传递过去
                        单选框、多选框 需设置value属性
                        下拉框 默认把选中的内容传至服务器,可设置value值传递指定值
                默认值
                        文本框、密码框、文本域 设置value属性即可
                        单选框、多选框 的指定项添加属性checked="checked"
                        下拉框 的指定项添加selected="selected。默认第一个
                get和post区别
                        get                数据显示在地址栏中。请求大小有限制
                        post        数据不会显示在地址栏中。请求大小无限制


        
        
        

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马