Java中线程超详细版本
线程
线程的概念:说到线程的概念,我们不得不提到进程。
进程:是指一个内存中运行的应用程序,每一个进程都有一个独立的内存空间。
线程: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中线程超详细版本相关推荐
- [Java高并发系列(5)][详细]Java中线程池(1)--基本概念介绍
1 Java中线程池概述 1.1 什么是线程池? 在一个应用当中, 我们往往需要多次使用线程, 这意味着我们需要多次创建和销毁线程.那么为什么不提供一个机制或概念来管理这些线程呢? 该创建的时候创建, ...
- JAVA中线程同步的方法(7种)汇总
JAVA中线程同步的方法(7种)汇总 同步的方法: 一.同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法. ...
- JAVA 正则表达式 (超详细,转)
转 JAVA 正则表达式 (超详细,转) 2015年03月25日 10:27:57 阅读数:1514 在Sun的Java JDK 1.40版本中,Java自带了支持正则表达式的包,本文就抛砖引玉地介绍 ...
- 源码阅读(34):Java中线程安全的Queue、Deque结构——ArrayBlockingQueue(4)
(接上文<源码阅读(33):Java中线程安全的Queue.Deque结构--ArrayBlockingQueue(3)>) 2.3.3.3.forEachRemaining() 方法 f ...
- JAVA中线程同步的几种实现方法
JAVA中线程同步的几种实现方法 一.synchronized同步的方法: 1.synchronized同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁, ...
- java中线程的生命周期
文章目录 java中Thread的状态 NEW Runnable BLOCKED WAITING TIMED_WAITING TERMINATED java中线程的生命周期 线程是java中绕不过去的 ...
- java中线程死锁及避免_如何避免Java线程中的死锁?
java中线程死锁及避免 如何避免Java中的死锁? 是Java面试中最受欢迎的问题之一,也是本季多线程的风格,主要是在高层提出,并带有很多后续问题. 尽管问题看起来很基础,但是一旦您开始深入研究,大 ...
- java中线程的状态以及线程栈分析
java中线程的状态 状态 说明 NEW 初始状态.线程刚刚被创建,并且start()方法还未被调用 RUNNABLE 运行状态.表示线程正在java虚拟机中执行,但是可能正在等待操作系统的其他资源, ...
- 源码阅读(32):Java中线程安全的Queue、Deque结构——ArrayBlockingQueue(2)
(接上文<源码阅读(31):Java中线程安全的Queue.Deque结构--ArrayBlockingQueue(1)>) 本篇内容我们专门分析ArrayBlockingQueue中迭代 ...
最新文章
- 开源交互式自动标注工具EISeg
- 刘涵 美国 西北大学 计算机,西北大学关于表彰2010-2011学年度学生先进集体-红帆.doc...
- 7天攻克运维瓶颈 玩转立体运维
- SnipperImages(Silverlight DEMO)控件设计之--Slider和ColorSlider
- PHP 正则表达式分割 preg_split 与 split 函数
- C++学习——C++中的四个智能指针
- 为什么程序员的社会地位不高?
- ERPSYSTEM开发教程01 框架介绍
- 主席树 POJ2104
- Group By和Order By的总结
- 即将举行的jQuery的培训活动
- 【ODBC】ODBC连接数据库详细说明
- 【学习备忘录】ele项目的环境配置
- 工业路由器和家用路由器的区别?
- 电脑录制的音频文件如何转换为MP3格式
- VUE实现长时间未操作退出登录
- 《黑客与画家》读书笔记(六)
- WebRTC实现多人视频聊天之客户端设计
- win7修改mac地址的三种方法
- 网络爬虫反反爬小技巧(六)奇淫技巧
热门文章
- linux yum安装erlang,在 CentOS 5.7 上通过 YUM 安装 Erlang 过程
- 【赠Home-Assistant初次安装的朋友】
- 【LabVIEW】入门-视觉
- 带通 带阻滤波器 幅频响应_一文带你通俗理解幅频响应和相频响应
- 美国科学院院士张首晟:摩尔定律即将失效,人工智能怎么化解这个尴尬? | 2017 IT领袖峰会...
- 如何卸载阿里云ECS服务器的阿里云盾和安骑士
- android中通过java的反射机制获取U盘名称
- 大话IT第12期:揭密疯狂的lulzsec***组织
- 常用GIS行业技术架构总结-技术运维产品
- 匹配系统Java开发,基于RFID的机场行李快速匹配系统的设计(Java,MySQL)