1.多线程

  • 线程状态分为:新建状态、就绪状态、运行状态、阻塞状态、死亡状态

    • 对象等待池的阻塞状态:运行状态执行了wait方法
    • 对向锁池的阻塞状态:试图获得某个同步锁,已经被其他线程占用,就会放到对象的锁池中
    • 其他阻塞状态:执行了sleep()方法、join方法()
  • 线程睡眠Thread.sleep()方法:当前线程放弃cpu,转到阻塞状态
  • 线程让步Thead.yield()静态方法:如果此时具有相同优先级的其他线程处于就绪状态,那么 yield()方法将把当前运行的线程放到可运行池中并使另一个线程运行。如果没有相同优先级的可运行线程,则此方法什么都不做。
  • 等待其他线程结束 join()方法:当前运行的线程可以调用另一个线程的 join()方法,当前运行的线程将转到阻塞状态,直至另一个线程运行结束,它才恢复运行。
  • machin.join() 就是执行的这个线程停止让给machin线程运行
  • 设置后台线程 Thread.setaemon(true)方法,就可以把当前线程设置为后台线程

2.定时器Timer

Timer timer = new Timer(true) //把与Timer关联的线程设置为后台线程
TimerTask task = new TimerTask(){//匿名内部类实现run方法
timer.schedule(task,10,500); //task用来设定所要定时器执行的任务;10为延迟执行的时间ms;500为每隔500ms重复执行一次任务
}

3.同步

  • 同步代码块

    • synchronized(this){} this表示引用当前类对象的锁
  • 同步方法锁
    • public synchronized String pop(){}
  • 什么情况会释放锁?
    • 执行完同步代码块,就会释放锁
    • 在执行同步代码块的过程中,遇到异常而导致线程终止,锁也会被释放
    • 在执行同步代码块的过程中,执行了锁所属对象的wait()方法,这个线程会释放锁,进入对象的等待池
  • 什么情况不会释放锁?
    • 在执行同步代码块的过程中,执行了 Thread.sleep()方法,当前线程放弃 CPU,开始睡眠,在睡眠中不会释放锁
    • 在执行同步代码块的过程中,执行了 Thread.yield()方法,当前线程放弃 CPU,但不会释放锁
    • 在执行同步代码块的过程中,其他线程执行了当前线程对象的 supend()发昂发,当前线程被暂停,但不会释放锁。Thread类的 supend()方法已经被废弃

4.线程通信

  • wait():执行该方法的线程释放对象的锁,Java虚拟机把该线程放到该对象的等待池中。该线程等待其他线程将它唤醒
  • notify():执行该方法的线程唤醒在对象的等待池中等待的一个线程。Java虚拟机从对象等待池中随机选择一个线程,把它转到对象的锁池中

5.中断阻塞

  • 当线程 A 处于阻塞状态时, 如果线程 B 调用线程 A 的 interrupt()方法,那么线程 A 会接收到一个 InterruptedException,并退出阻塞状态,开始进行异常处理

6.线程控制

  • start():启动线程
  • suspend():使线程暂停(被废弃)
  • resume():使暂停的线程恢复运行(被废弃)
  • stop()::终止线程(被废弃)

7.线程组

  • ThreadGroup类的 activeCount()方法:获得当前或者的线程的数目
  • ThreadGroup类的 enumerate(machines)方法:该方法把当前活着的线程引用存放到参数machines中
  • main(){
    ThreadGroup group = new ThreadGroup("machines");
    for(int i = 1;i <= 5;i++){
    Machine machine = new Machine(group,"machine"+i);
    machine.start();
    }
    int activeCount = group.activeCount();
    Thread[] machines = new Thread[activeCount];
    group.enumerate(machines);
    for(int i = 0;i < activeCount;i++)
    syso(machines[i].getName()+" is alive");

8.ThreadLocal

  • ThreadLocal类 可以用来存放线程的局部变量,每个线程都有单独的局部变量,彼此之间不会共享

    •  public T get():返回当前线程的局部变量
    •  protected T initialValue():返回当前线程的局部变量的初始值
    •  public void set(T value):设置当前线程的局部变量
    •  ThreadLocal类中有一个Map 缓存,用户存储每一个线程的局部变量

多线程&定时器Timer&同步&线程通信&ThreadLocal的更多相关文章

  1. [并发编程 - 多线程:信号量、死锁与递归锁、时间Event、定时器Timer、线程队列、GIL锁]

    [并发编程 - 多线程:信号量.死锁与递归锁.时间Event.定时器Timer.线程队列.GIL锁] 信号量 信号量Semaphore:管理一个内置的计数器 每当调用acquire()时内置计数器-1 ...

  2. Python之路(第四十五篇)线程Event事件、 条件Condition、定时器Timer、线程queue

    一.事件Event Event(事件):事件处理的机制:全局定义了一个内置标志Flag,如果Flag值为 False,那么当程序执行 event.wait方法时就会阻塞,如果Flag值为True,那么 ...

  3. Linux多线程--使用信号量同步线程【转】

    本文转载自:http://blog.csdn.net/ljianhui/article/details/10813469 信号量.同步这些名词在进程间通信时就已经说过,在这里它们的意思是相同的,只不过 ...

  4. 多线程-定时器Timer

    2019-04-1218:03:32 package 多线程.定时器Timer_重要; import java.util.Timer; import java.util.TimerTask; publ ...

  5. Qt QThread 线程创建,线程同步,线程通信 实例

    1.  继承QThread, 实现run()方法, 即可创建线程. 2. 实例1 代码 myThread.h #ifndef MYTHREAD_H #define MYTHREAD_H #includ ...

  6. C#线程同步--线程通信

    问题抽象:当某个操作的执行必须依赖于另一个操作的完成时,需要有个机制来保证这种先后关系.线程通信方案:ManualResetEventSlim.ManualResetEvent.AutoResetEv ...

  7. java多线程--定时器Timer的使用

    定时的功能我们在手机上见得比较多,比如定时清理垃圾,闹钟,等等.定时功能在java中主要使用的就是Timer对象,他在内部使用的就是多线程的技术. Time类主要负责完成定时计划任务的功能,就是在指定 ...

  8. 多线程 定时器 Timer TimerTask

    定时器是一种特殊的多线程,使用Timer来安排一次或者重复执行某个任务 package org.zln.thread; import java.util.Date; import java.util. ...

  9. java多线程回顾4:线程通信

    1.线程的协调运行 线程的协调运行有一个经典案例,即生产者和消费者问题. 假设有一个货架,生产者往货架上放货物,消费者从货架上取货物. 为了方便讲解,制定一个规则,生产者每放上一个货物,消费者就得取走 ...

随机推荐

  1. VS2010 C++学习(5):基于DirectShow的视频预览录像程序

    VS2010 C++学习(5):基于DirectShow的视频 预览录像程序 学习VC++编制的基于DirectShow视频捕获程序,主要练习基于DirectShow程序的应用. 一.         ...

  2. nested exception is java.sql.SQLException: IO 错误

    1.错误描述 (mx.messaging.messages::ErrorMessage)#0 body = (null) clientId = "18CE3B03-9709-9DA8-763 ...

  3. Django学习-25-图片验证码实例

    处理流程 用户请求网页 --> 后台发送登录界面的静态页面 --> 后台在内存中生成验证码 --> 验证码保存在用户对应的Session中 --> 返回验证码图片到前端 用户登 ...

  4. POJ 2516 Minimum Cost (费用流)

    题面 Dearboy, a goods victualer, now comes to a big problem, and he needs your help. In his sale area ...

  5. [USACO12FEB]Nearby Cows

    题意 给出一棵n个点的无根树,每个点有权值,问每个点向外不重复经过k条边的点权和 题解 设f[i][j]表示所有离i节点距离为j的点权和,v为它周围相邻的点,t为v的个数,则 j > 2 f[i ...

  6. Vue-组件嵌套之——父组件向子组件传值

    父组件向子组件传值步骤: 在这里先定义一下,相对本案例来说:App.vue是父组件,Second-module.vue是子组件. 一.首先,值肯定是定义在父组件中的,供所有子组件共享.所以要在父组件的 ...

  7. kali使用Fluxion钓鱼WiFi

    先介绍一下这个软件 这个软件是一个可以生成一个钓鱼WiFi的软件,可以伪装成一个正常的WiFi,但是是没有密码的,但是其他信息都是一样的,一旦开启这个攻击,正常的那个AP就无法正常连接,只能连到这个伪 ...

  8. CyQ.data MDataTable

    前言 以前一两个月才出一篇,这三天有点变态地连续1天1篇(其实都是上周末两天写好的存货). 短期应该没有新的和此框架相关的文章要写了,这应该是最后一篇,大伙且看且珍惜. 前两篇讲数据库读写分享和分布式 ...

  9. jquery中的ajax方法参数

    引用来自:http://www.cnblogs.com/tylerdonet/p/3520862.html jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String ...

  10. VLOOKUP和MATCH嵌套以高效引用多列数据

    VLOOKUP函数在日常工作中十分常见,以至于你要是没用过VLOOKUP函数,你都不好意思说你懂EXCEL. 一般情况下,我们需要在源数据中查找某个指定列的数据,就会用到VLOOKUP函数(如果是指定 ...