1,创建线程
··· 继承Thread类:
    必须覆写Thread的run方法。
··· 实现Runnable接口:
    必须实现run方法,再传入到Thread(Runnable t)构造方法中。
··· 实现Callable接口:
      class A implements Callables<String>{}
    (1)实现类A 必须实现Callable的call方法,并创建A类的对象。a = new A();
    (2)将类A的对象a作为构造方法参数创建  FutureTask对象。ft = new FutureTask<>(a);
    (3)将 ft作为构造方法参数创建 Thread对象。t = new Thread(ft);
    (4)运行线程。 t.start();
    (5)获取执行结果。 res = ft.get();
    返回数据较少使用Callable,较多使用Runnable加消息队列。
 
2,线程
··· 常用实例方法:
    启动:start();   // 只可以调用一次;
    设置优先级:setPriority(int);  // 范围从1~10,默认是5,操作系统对优先级高的线程调度更频繁;
··· 线程的状态:
    New:新创建的线程,尚未执行;
    Runnable:运行中的线程,正在执行run()方法的Java代码;
    Blocked:运行中的线程,因为某些操作被阻塞而挂起;
    Waiting:运行中的线程,因为某些操作在等待中;
    Timed Waiting:运行中的线程,因为执行sleep()方法正在计时等待;
    Terminated:线程已终止,因为run()方法执行完毕。
    还有一种是5种状态:
    new,Runnable,run,block,deal
··· 线程中断:
    概念:线程A向线程B发送终止信号。
    方式一:线程A调用 b.interrupt()向线程B发送“中断请求”,而线程B的run方法中要时刻检测isInterrupted()
    方式二:设置标志位,标志位要使用共享变量(用volatile修饰)。
··· 守护线程:
    一种无限循环的线程,例如,一个定时触发任务的线程。
    概念:守护线程是为其他线程服务的线程,当所有非守护线程退出时,JVM退出。
    注意:守护线程不能持有需要关闭的资源(如打开文件)。
 
3,线程同步
··· 使用synchronized加锁:
    对代码同步:synchronized(lock){...};只有获取了lock才会执行{...}中的代码。
    对方法同步:synchronized void func();实例方法锁住的是this,静态方法锁住的是 类.class。
··· 解决死锁:当多线程同时使用多个锁时,线程获取锁的顺序要一致。
··· 生产者消费者模型:使用 lock.wait();使线程变为等待状态线程。lock.notifyAll();唤醒等待的线程。
··· 注意:
    · 用类作为同步监视器时这个类所创建的对象也会共享类的锁,但是不影响this锁。
    · synchronized是可重入锁,要注意加锁的个数。
 
4,锁
··· synchronized:
    对象锁,在使用synchronized同步时,可以用任意对象作为锁。
    缺点:一是比较笨重,二是获取时必须一直等待,没有额外的尝试机制。
···  ReentrantLock:
    可重入锁,与synchronized类似,但是比它更安全。可以用Condition来实现类似的wait和notify。
    优点:可以尝试获取锁,如果一定时间后还没有获得锁,就可以做一些额外处理,而不是一直等下去,lock.tryLock(1, TimeUnit.SECONDS)尝试去获取锁,如果1秒后还没获取到就执行其他操作。
    缺点:过于保护,对于只读取不修改数据的线程时,也会加锁,但其实是可以允许多个线程同时读的。如果对读不加锁,假如读的是一个长度为10的列表,当读到5时,如果时间片用完了;切换到修改线程,把2和8的数据被修改了。然后读线程继续读,将会读到2没有修改,而8被修改了的脏数据。
··· ReadWriteLock:
    读写锁,可以把读和写分离。
    优点:对于大量读取,少量修改的数据,可以大大提高并发,允许同时读。
    缺点:是一个悲观锁(针对读锁),即在读的时候不允许写。
··· StampedLock:
    读写锁的改进。
    优点:是一个乐观锁(针对读锁),在读的时候允许写,读完后通过版本判断是否修改了,如果修改了则再读一次。
    缺点:代码更加复杂,是不可重入锁。
··· 注意:
    · 如果每次访问的冲突概率小于20%,则使用乐观锁,否则使用悲观锁,乐观锁的重试次数不得小于3次。
 
5, Concurrent集合
··· 概念:是Java标准库java.util.concurrent提供的线程安全的集合。
··· 对应的非线程安全的集合:
 
 
6,线程池的线程数设置:
··· 项目中尽量使用线程池,不要显示创建线程。因为创建和销毁线程很消耗性能。
1、CPU密集型:CPU核数 + 1;
2、IO密集型:CPU核数 * 2;
3、互联网IO:CPU核数 / (1 - 柱塞系数);例如阻塞系数0.8,CPU核数4,则设置线程数为 20。
 
注意事项
    · 上下文对象:定义:在一个线程中,横跨若干方法调用,需要传递的对象叫做上下文,他是一种状态。ThreadLocal可以在一个线程中传递同一个对象。
    · 线程中的yield方法:让出当前线程的CPU执行权。在数据库插入时调用,防止数据库假死。

4,Java中的多线程的更多相关文章

  1. Java 中传统多线程

    目录 Java 中传统多线程 线程初识 线程的概念 实现线程 线程的生命周期 常用API 线程同步 多线程共享数据的问题 线程同步及实现机制 线程间通讯 线程间通讯模型 线程中通讯的实现 @(目录) ...

  2. Java中使用多线程、curl及代理IP模拟post提交和get访问

    Java中使用多线程.curl及代理IP模拟post提交和get访问 菜鸟,多线程好玩就写着玩,大神可以路过指教,小弟在这受教,谢谢! 更多分享请关注微信公众号:lvxing1788 ~~~~~~ 分 ...

  3. 【转】Java中的多线程学习大总结

    多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的. 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上图中基本上囊括了Java中多线程 ...

  4. Java中的 多线程编程

    Java 中的多线程编程 一.多线程的优缺点 多线程的优点: 1)资源利用率更好2)程序设计在某些情况下更简单3)程序响应更快 多线程的代价: 1)设计更复杂虽然有一些多线程应用程序比单线程的应用程序 ...

  5. java中的多线程 // 基础

    java 中的多线程 简介 进程 : 指正在运行的程序,并具有一定的独立能力,即 当硬盘中的程序进入到内存中运行时,就变成了一个进程 线程 : 是进程中的一个执行单元,负责当前程序的执行.线程就是CP ...

  6. Java中的多线程=你只要看这一篇就够了

    如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其 ...

  7. Android学习记录(5)—在java中学习多线程下载之断点续传②

    在上一节中我们学习了在java中学习多线程下载的基本原理和基本用法,我们并没有讲多线程的断点续传,那么这一节我们就接着上一节来讲断点续传,断点续传的重要性不言而喻,可以不用重复下载,也可以节省时间,实 ...

  8. Java中使用多线程、curl及代理IP模拟post提交和get訪问

    Java中使用多线程.curl及代理IP模拟post提交和get訪问 菜鸟,多线程好玩就写着玩.大神能够路过不吝赐教.小弟在这受教.谢谢! 很多其它分享请关注微信公众号:lvxing1788 ~~~~ ...

  9. Java中的多线程技术全面详解

    本文主要从整体上介绍Java中的多线程技术,对于一些重要的基础概念会进行相对详细的介绍,若有叙述不清晰或是不正确的地方,希望大家指出,谢谢大家:) 为什么使用多线程 并发与并行 我们知道,在单核机器上 ...

  10. 详细分析 Java 中实现多线程的方法有几种?(从本质上出发)

    详细分析 Java 中实现多线程的方法有几种?(从本质上出发) 正确的说法(从本质上出发) 实现多线程的官方正确方法: 2 种. Oracle 官网的文档说明 方法小结 方法一: 实现 Runnabl ...

随机推荐

  1. Codeforces Roundd #573 (Div. 2)

    D. Tokitsukaze, CSL and Stone Game 题意:有n堆石头,每人每次只能去一颗石子,若轮到当前人没任何一堆石子可以取或当前人取到后剩下有俩堆石子个数相同则当前人输: 给定石 ...

  2. HUPO|PSI|PeptideAtlas|TPP|Partial submission|Complete submission|proteomeXchange

    蛋白质组实验数据提交 需要共享数据,共享要求: 质谱实验数据 HUPO Proteomics Standards Initiative (http://www.psidev.info/overview ...

  3. 漫谈2014年人机交互(CHI)大会

    编者按:2014年度以人机交互为主题的顶级会议ACM SIGCHI已经落下帷幕.微软研究院在此次会议的入选论文总数仅次于卡耐基•梅隆大学,位列第二.此次会议中,有哪些创新想法或技术让人眼前一亮?听微软 ...

  4. 限制IP每分钟访问10次

    转载:https://www.jianshu.com/p/d1326ab657ff IP请求限制,之前用过redis的set设置时间戳一分钟过期:也用过nginx的IP限流配置.前者,没法解决“用户在 ...

  5. python学习笔记(10)函数(二)

    (函数的参数&递归函数) 一.函数的参数 Python的函数定义非常简单,但灵活度却非常大.除了正常定义的必选参数外,还可以使用默认参数.可变参数和关键字参数,使得函数定义出来的接口,不但能处 ...

  6. python与模块的导入方式

    今日所得 模块 import from...import... 循环导入 相对导入 绝对导入 软件开发目录规范 模块 模块:是一系列功能的集合体 模块的三种来源:1.内置模块(Python解释器自带的 ...

  7. [LC] 268. Missing Number

    Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missin ...

  8. JavaScript学习总结(七)Ajax和Http状态字

    转自:http://segmentfault.com/a/1190000000691919 Ajax及其工作原理 AJAX 是一种与服务器交换数据无需刷新网页的技术,最早由Google公司在谷歌地图里 ...

  9. Python自动化之数据驱动(转载下自己的日常练习笔记)

    一.execl数据驱动 1.xlutils简要说明 导包:pip3 install xlutils 注意⚠️:xlutils在介些Execl文件的时候,只识别.xls后缀的文件,如果是.xlsx后缀的 ...

  10. [Redis] Redis哨兵模式部署 - zz胖的博客

    1. 部署Redis集群 redis的安装及配置参考[redis部署] 本文以创建一主二从的集群为例. 1.1 部署与配置 先创建sentinel目录,在该目录下创建8000,8001,8002三个以 ...