线程

线程的概念:说到线程的概念,我们不得不提到进程。

进程:是指一个内存中运行的应用程序,每一个进程都有一个独立的内存空间。

线程:1、是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换,并发执行,一个进程最少有一个线程 。 2、线程实际上是在进程的基础上进一步划分的,一个进程启动之后,里面若干个执行路径又可以划分成若干个线程。

一、线程如何创建:

线程有三种创建方法:
常见的两种方式是分别是继承Thread类,实现Runnable接口。第三种比较少见

1.继承Thread类创建线程
首先需要创建一个类,这个继承了Thread类的类就是一个线程的类,在继承之后需要重写一下run方法,也就是线程要执行的任务,这里的代码就是一条新的执行路径。而这个执行路径的触发方式,不是调用run()方法,而是通过thread对象的start()方法来启动任务。

2.实现Runnable接口
首先,要创建一个类,并且实现Runnable接口,并实现里面的抽象方法run(),方法中执行的是线程的任务。此时理解为这个类里面存放的是即将要被线程执行的任务。

接下来将这个类实例化,再new一个线程,Thread的()里面参数是r,也就是线程的任务,再通过start()去触发这个执行路径。

MyRunnable r = new Runnable();
Thread t = new Thread(r);
t.start();

这是实现Runnable的线程创建方式。

二、Thread类的各种常用方法:

我们先来看看Thread类的构造方法:

Thread类不仅可以传入Runnable类型的任务,还可以给线程取一个名字。

守护线程和用户线程:在Thread()中有一个方法:setDaemon(boolean on),这个方法的作用是将此线程标记为守护线程。(守护线程是用来守护用户线程的,当用户线程全部死亡后,守护线程也随之死亡,它是依附于用户线程的)

接下来,我们来看看线程的常用方法 -> 设置和获取正在执行的线程名称

Thread.currentThread().getName();

-> 线程的指定时间休眠(单位是毫秒)

Thread.sleep(100ms);

-> 线程中断(线程是一个独立的执行路径,它是否应该结束,应该由其自身决定)
当检测到t1的中断标记后,就会检测到异常。可以说是人为的让线程中止,常见的方法有sleep(),wait(),这些方法中都有中断标记,会让线程中断。

Thread t1 = new Thread(new MyRunnable);
{中间一大堆主线程执行的操作}
t1.interrupt; //给线程打上中断标记


-> 线程等待,导致当前线程等待被唤醒

Thread.wait()

-> 线程唤醒,唤醒此对象上等待的单个线程

Thread.notify();

-> 线程唤醒,唤醒此对象上等待的全部线程

Thread.notifyAll();

这两个标黄的方法常用于线程之间通信的问题。

三、线程的安全问题:

线程都是抢占式的进行任务,很有可能会造成数据不统一的问题。那么,如何去解决呢?一共有三种方法:
解决方案1:同步代码块
格式:synchronized(锁对象){}

锁对象其实就是创建一个对象,去表示这把锁。

这里需要注意的是,自己得新建一个锁对象,像这样:

Object o = new Object();
//然后就可以使用同步代码块了synchronized (o) {各种各样的方法体}

解决方案2:同步方法
格式:public synchronized void 方法名(){ }

通过第一种解决方案我们可以知道,要想有锁,就一定得有一个对象,那么同步方法的锁对象是谁?当非静态的时候,锁的对象是this,即调用该方法的this。当静态的时候,锁的对象其实就是类名.class,这也就解释了万事万物皆对象。

解决方案3:显示锁和隐式锁
显示锁l Lock 子类ReentrantLock()

那么,应该怎么玩呢?

Lock l = new ReentrantLock();//新建一个锁的对象
l.lock();//手动上锁
l.unlock();//手动解锁

还有一个需要注意的点,就是公平锁和非公平锁。
锁这个东西,锁住以后,如果有一百个线程要执行这段代码,一看锁住了,都要排队。都需要等,等这个锁解开,再抢占式的去执行。那么什么叫做公平锁呢?就是先来先到,需要排队。
怎么去玩公平锁呢?也很简单。稍改一下上面的代码,加一个true。

Lock l = new ReentrantLock(fair:true);

四、线程死锁:

死锁是指两个或两个以上的进程(线程)在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。

五、线程的状态:

六、线程池:

线程池的分类,一共有四种线程池。缓存线程池,定长线程池,单线程线程池,周期定长线程池

       //这是缓存线程池ExecutorService service = Executors.newCachedThreadPool();//指挥线程池中加入新的任务service.execute(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+"锄禾日当午");}});
        //这是定长线程池ExecutorService service = Executors.newFixedThreadPool(2);service.execute(new Runnable() {@Overridepublic void run() {System.out.println("定长线程池");}});
//单线程线程池
ExecutorService service = Executors.newSingleThreadExecutor();
//这是周期性线程池public static void main(String[] args) {ScheduledExecutorService service = Executors.newScheduledThreadPool(2);
/*         service.schedule(new Runnable() {@Overridepublic void run() {System.out.println("土鸡的春天");}},3, TimeUnit.SECONDS);*//*周期性执行任务参数1:任务参数2:延迟时长数字(第一次执行在什么时间之后)参数3:周期时长数字(每嗝多久执行一次)参数4:时长数字的单位*/service.scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {System.out.println("土狗的爱");}},5,1,TimeUnit.SECONDS);}
}

文章目录

    • 线程
  • 一、线程如何创建:
  • 二、Thread类的各种常用方法:
  • 三、线程的安全问题:
  • 四、线程死锁:
  • 五、线程的状态:
  • 六、线程池:

Java中线程超详细版本相关推荐

  1. [Java高并发系列(5)][详细]Java中线程池(1)--基本概念介绍

    1 Java中线程池概述 1.1 什么是线程池? 在一个应用当中, 我们往往需要多次使用线程, 这意味着我们需要多次创建和销毁线程.那么为什么不提供一个机制或概念来管理这些线程呢? 该创建的时候创建, ...

  2. JAVA中线程同步的方法(7种)汇总

    JAVA中线程同步的方法(7种)汇总 同步的方法: 一.同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法. ...

  3. JAVA 正则表达式 (超详细,转)

    转 JAVA 正则表达式 (超详细,转) 2015年03月25日 10:27:57 阅读数:1514 在Sun的Java JDK 1.40版本中,Java自带了支持正则表达式的包,本文就抛砖引玉地介绍 ...

  4. 源码阅读(34):Java中线程安全的Queue、Deque结构——ArrayBlockingQueue(4)

    (接上文<源码阅读(33):Java中线程安全的Queue.Deque结构--ArrayBlockingQueue(3)>) 2.3.3.3.forEachRemaining() 方法 f ...

  5. JAVA中线程同步的几种实现方法

    JAVA中线程同步的几种实现方法 一.synchronized同步的方法: 1.synchronized同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁, ...

  6. java中线程的生命周期

    文章目录 java中Thread的状态 NEW Runnable BLOCKED WAITING TIMED_WAITING TERMINATED java中线程的生命周期 线程是java中绕不过去的 ...

  7. java中线程死锁及避免_如何避免Java线程中的死锁?

    java中线程死锁及避免 如何避免Java中的死锁? 是Java面试中最受欢迎的问题之一,也是本季多线程的风格,主要是在高层提出,并带有很多后续问题. 尽管问题看起来很基础,但是一旦您开始深入研究,大 ...

  8. java中线程的状态以及线程栈分析

    java中线程的状态 状态 说明 NEW 初始状态.线程刚刚被创建,并且start()方法还未被调用 RUNNABLE 运行状态.表示线程正在java虚拟机中执行,但是可能正在等待操作系统的其他资源, ...

  9. 源码阅读(32):Java中线程安全的Queue、Deque结构——ArrayBlockingQueue(2)

    (接上文<源码阅读(31):Java中线程安全的Queue.Deque结构--ArrayBlockingQueue(1)>) 本篇内容我们专门分析ArrayBlockingQueue中迭代 ...

最新文章

  1. 开源交互式自动标注工具EISeg
  2. 刘涵 美国 西北大学 计算机,西北大学关于表彰2010-2011学年度学生先进集体-红帆.doc...
  3. 7天攻克运维瓶颈 玩转立体运维
  4. SnipperImages(Silverlight DEMO)控件设计之--Slider和ColorSlider
  5. PHP 正则表达式分割 preg_split 与 split 函数
  6. C++学习——C++中的四个智能指针
  7. 为什么程序员的社会地位不高?
  8. ERPSYSTEM开发教程01 框架介绍
  9. 主席树 POJ2104
  10. Group By和Order By的总结
  11. 即将举行的jQuery的培训活动
  12. 【ODBC】ODBC连接数据库详细说明
  13. 【学习备忘录】ele项目的环境配置
  14. 工业路由器和家用路由器的区别?
  15. 电脑录制的音频文件如何转换为MP3格式
  16. VUE实现长时间未操作退出登录
  17. 《黑客与画家》读书笔记(六)
  18. WebRTC实现多人视频聊天之客户端设计
  19. win7修改mac地址的三种方法
  20. 网络爬虫反反爬小技巧(六)奇淫技巧

热门文章

  1. linux yum安装erlang,在 CentOS 5.7 上通过 YUM 安装 Erlang 过程
  2. 【赠Home-Assistant初次安装的朋友】
  3. 【LabVIEW】入门-视觉
  4. 带通 带阻滤波器 幅频响应_一文带你通俗理解幅频响应和相频响应
  5. 美国科学院院士张首晟:摩尔定律即将失效,人工智能怎么化解这个尴尬? | 2017 IT领袖峰会...
  6. 如何卸载阿里云ECS服务器的阿里云盾和安骑士
  7. android中通过java的反射机制获取U盘名称
  8. 大话IT第12期:揭密疯狂的lulzsec***组织
  9. 常用GIS行业技术架构总结-技术运维产品
  10. 匹配系统Java开发,基于RFID的机场行李快速匹配系统的设计(Java,MySQL)