一、Java中实现多线程的两种方式
1) 继承Thread类
Thread类包括了包括和创建线程所需的一切东西。

Thread 最重要的方法是 run()。编写线程程序时须要覆盖 run() 方法,run() 方法是与别的线程并行运行的,故存在资源竞争和同步问题。

。Thread 还包括一个特殊的方法 start()。其作用是对线程进行特殊的初始化。然后调用run()。
调用start方法方可启动线程,而run方法仅仅是thread的一个普通方法调用。还是在主线程里运行。应该把须要并行处理的代码放在run()方法中,start()方法启动线程将自己主动调用 run()方法,这是由jvm的内存机制规定的。

而且run()方法必须是public訪问权限。返回值类型为void.。
2) 实现Runable接口
Runable接口仅仅有一个函数 run(),该函数必须由实现了该接口的类来实现。

使用 Runable 接口的时候不能直接创建所需类的对象并运行它,而必须从 Thread 类的一个实例内部运行。

二、线程状态
线程生命周期中共同拥有4中状态:新状态、可运行状态、死亡状态和堵塞状态。当中,
新状态:线程已创建。而start()还没有调用;
可运行状态:线程可以运行,等待CPU时间被分配给该线程后就可以;
死亡状态:run()返回后线程就会死亡。

或者调用stop()或者destroy()方法也会使得线程死亡。然而stop()会产生异常,destroy()则是强制终止从而没有释放锁;
堵塞状态:线程不会被分配CPU时间,无法运行。

堵塞状态情况比較复杂,线程进入堵塞状态的原因主要是:
1)调用sleep(ms),进入睡眠
2)调用suspend(),挂起线程。(调用resume()恢复运行)
3)调用wait(),暂停线程。(调用notify()或者notifyAll()恢复运行)
4)I/O 堵塞
5)调用还有一个处于锁定状态的对象的同步方法

三、对象的锁
Java中全部对象都具有隐式关联的监视程序,即“锁”。

程序不用去生成一个锁的对象,由于不论什么对象都具有了锁,通常在程序中都使用this对象。

与锁有关的方法有:
1)wait()
调用该方法的线程须要等待。直到得到该对象的锁,线程才干继续运行。
2)wait(long)和wait(long,int)
传递的參数指定了线程可以等到的最长时间。假设指定时间内没有得到锁,则会抛出异常interrupedException,程序处理完异常后继续运行。
3)notify()和notifyAll()
在锁对象上调用notify()或者notifyAll()方法就行释放对象上的锁。

当中,notify()仅仅能唤醒一个等待该锁的线程;而notifyAll()则会唤醒全部等待该锁的线程,然而被唤醒的线程中哪个会获得锁是由虚拟机来决定的。

四、线程的同步
synchronized 语句通过使用对象锁同步多个线程对某一特定代码段的訪问,在不论什么时候都仅仅能有一个线程来运行被保护的代码。

synchronized (taskQueue) {
newTask.setTaskId(++taskCounter);
newTask.setSubmitTime(new Date());
taskQueue.add(newTask);
/* 唤醒队列, 開始运行 */
taskQueue.notifyAll();
}

以上样例中,运行 synchronized (taskQueue) 。线程必须取得对象taskQueue的锁。假设线程没有获取到对象taskQueue的锁。线程就会停止在 synchronized 指令上。

直到线程离开 synchronized 指令保护的代码段,线程会将锁返回给对象taskQueue。

Java的线程机制的更多相关文章

  1. java中线程机制

    java中线程机制,一开始我们都用的单线程.现在接触到多线程了. 多线性首先要解决的问题是:创建线程,怎么创建线程的问题: 1.线程的创建: 四种常用的实现方法 1.继承Thread. Thread是 ...

  2. 一步一步掌握java的线程机制(二)----Thread的生命周期

    之前讲到Thread的创建,那是Thread生命周期的第一步,其后就是通过start()方法来启动Thread,它会执行一些内部的管理工作然后调用Thread的run()方法,此时该Thread就是a ...

  3. 一步一步掌握java的线程机制(一)----创建线程

    现在将1年前写的有关线程的文章再重新看了一遍,发现过去的自己还是照本宣科,毕竟是刚学java的人,就想将java的精髓之一---线程进制掌握到手,还是有点难度.等到自己已经是编程一年级生了,还是无法将 ...

  4. Java的多线程机制系列:(一)总述及基础概念

    前言 这一系列多线程的文章,一方面是个人对Java现有的多线程机制的学习和记录,另一方面是希望能给不熟悉Java多线程机制.或有一定基础但理解还不够深的读者一个比较全面的介绍,旨在使读者对Java的多 ...

  5. Java多线程与并发库高级应用-传统线程机制回顾

    1.传统线程机制的回顾 1.1创建线程的两种传统方式 在Thread子类覆盖的run方法中编写运行代码 // 1.使用子类,把代码放到子类的run()中运行 Thread thread = new T ...

  6. Java线程机制学习

    前面的文章中总结过Java中用来解决共享资源竞争导致线程不安全的几种常用方式: synchronized: ReentrantLock: ThreadLocal: 这些都是在简单介绍了基本用法的基础上 ...

  7. Java的多线程机制系列:不得不提的volatile及指令重排序(happen-before)

    一.不得不提的volatile volatile是个很老的关键字,几乎伴随着JDK的诞生而诞生,我们都知道这个关键字,但又不太清楚什么时候会使用它:我们在JDK及开源框架中随处可见这个关键字,但并发专 ...

  8. java的锁机制

    一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限,在Java里边就是拿到某个同步对象的锁(一个对象只有一把锁): 如果这个时候同步对象的锁被其他线程拿走了,他(这个线 ...

  9. Java多线程--线程安全问题的相关研究

    在刚刚学线程的时候我们经常会碰到这么一个问题:模拟火车站售票窗口售票.代码如下: package cn.blogs.com.isole; /* 模拟火车站售票窗口售票,假设有50张余票 */ publ ...

随机推荐

  1. BZOJ 2424 DP OR 费用流

    思路: 1.DP f[i][j]表示第i个月的月底 还剩j的容量 转移还是相对比较好想的-- f[i][j+1]=min(f[i][j+1],f[i][j]+d[i]); if(j>=u[i+1 ...

  2. Adobe Photoshop CC 2015(PS CC 2015)看图不说话

  3. 前端验证银行卡(Luhn校验算法)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 2018年湘潭大学程序设计竞赛 Fibonacci进制

    Fibonacci数是非常有名的一个数列,它的公式为 f(n)=f(n-1)+f(n-2),f(0)=1,f(1)=2.  我们可以把任意一个数x表示成若干不相同的Fibonacci数的和, 比如说1 ...

  5. webpack简短版零工程构建项目(二)

    webpack使用总结 1.初始化一个项目 npm init -y 之后会生成一个package.json配置文件. 2.安装webpack,vue,vue-loader npm install we ...

  6. ES6学习笔记(十六)async函数

    1.含义 ES2017 标准引入了 async 函数,使得异步操作变得更加方便. async 函数是什么?一句话,它就是 Generator 函数的语法糖,号称异步的终极解决方案. 前文有一个 Gen ...

  7. Redis数据持久化的两种方式RDB和AOF

    由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数据保存到磁 盘上,当redis重启后,可以从磁盘中恢复数据.redis提 ...

  8. PHP实时生成并下载超大数据量的EXCEL文件

    最近接到一个需求,通过选择的时间段导出对应的用户访问日志到excel中, 由于用户量较大,经常会有导出50万加数据的情况.而常用的PHPexcel包需要把所有数据拿到后才能生成excel, 在面对生成 ...

  9. js 异步加载的方式

    js 异步加载的方式 渲染引擎遇到 script 标签会停下来,等到执行完脚本,继续向下渲染 defer 是“渲染完再执行”,async 是“下载完就执行”,defer 如果有多个脚本,会按照在页面中 ...

  10. JS 中深拷贝的几种实现方法

    JS 中深拷贝的几种实现方法1.使用递归的方式实现深拷贝 //使用递归的方式实现数组.对象的深拷贝 function deepClone1(obj) { //判断拷贝的要进行深拷贝的是数组还是对象,是 ...