Java多线程中的常用方法
本文将带你讲诉Java多线程中的常用方法
Java多线程中的常用方法有如下几个
start,run,sleep,wait,notify,notifyAll,join,isAlive,currentThread,interrupt
1)start方法
用于启动一个线程,使相应的线程进入排队等待状态。一旦轮到它使用CPU的资源的时候,它就可以脱离它的主线程而独立开始
自己的生命周期了。注意即使相应的线程调用了start方法,但相关的线程也不一定会立刻执行,调用start方法的主要目的是使
当前线程进入排队等待。不一定就立刻得到cpu的使用权限...
2)run方法
Thread类和Runnable接口中的run方法的作用相同,都是系统自动调用而用户不得调用的。
3)sleep和wait方法
Sleep:是Java中Thread类中的方法,会使当前线程暂停执行让出cpu的使用权限。但是监控状态依然存在,即如果当前线程
进入了同步锁的话,sleep方法并不会释放锁,即使当前线程让出了cpu的使用权限,但其它被同步锁挡在外面的线程也无法获
得执行。待到sleep方法中指定的时间后,sleep方法将会继续获得cpu的使用权限而后继续执行之前sleep的线程。
Wait:是Object类的方法,wait方法指的是一个已经进入同步锁的线程内,让自己暂时让出同步锁,以便其它正在等待此同步
锁的线程能够获得机会执行。,只有其它方法调用了notify或者notifyAll(需要注意的是调用notify或者notifyAll方法并不释放
锁,只是告诉调用wait方法的其它 线程可以参与锁的竞争了..)方法后,才能够唤醒相关的线程。此外注意wait方法必须在同步关
键字修饰的方法中才能调用。
为了更好的理解上面的内容,请看下面的代码:
package com.yonyou.test; /**
* 测试类
* @author 小浩
* @创建日期 2015-3-2
*/ public class Test{
public static void main(String[] args){
//启动线程一
new Thread(new Thread1()).start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(new Thread2()).start();
}
} /**
* 线程一的实体类
* @author 小浩
* @创建日期 2015-3-2
*/
class Thread1 implements Runnable{
@Override
public void run() {
//由于这里的Thread1和Thread2的两个run方法调用的是同一个对象监视器,所以这里面就不能使用this监视器了
//因为Thread1的this和Thread2的this指的不是同一个对象。为此我们使用Test这个类的字节码作为相应的监视器
synchronized(Test.class){
System.out.println("enter thread1...");
System.out.println("thread1 is waiting...");
try {
//释放同步锁有两种方式一种是程序自然的离开synchronized的监视范围,另外一种方式在synchronized管辖的返回内调用了
//wait方法,这里就使用wait方法来释放同步锁,
Test.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread1 is going on ...");
System.out.println("thread1 is being over ...");
}
}
} /**
* 线程二的实体类
* @author 小浩
* @创建日期 2015-3-2
*/
class Thread2 implements Runnable{
@Override
public void run() {
synchronized(Test.class){
System.out.println("enter thread2 ...");
System.out.println("thread2 notify other thread can release wait sattus ...");
//由于notify不会释放同步锁,即使thread2的下面调用了sleep方法,thread1的run方法仍然无法获得执行,原因是thread2
//没有释放同步锁Test
Test.class.notify();
System.out.println("thread2 is sleeping ten millisecond ...");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread2 is going on ...");
System.out.println("thread2 is being over ...");
} }
}
上面运行的结果为:
enter thread1...
thread1 is waiting...
enter thread2 ...
thread2 notify other thread can release wait sattus ...
thread2 is sleeping ten millisecond ...
thread2 is going on ...
thread2 is being over ...
thread1 is going on ...
thread1 is being over ...
亲,请仔细分析上面的结果哦~~~这样你会醍醐灌顶的哦~
4) notify和notifyAll
释放因为调用wait方法而正在等待中的线程。notify和notifyAll的唯一区别在于notify唤醒某个正在等待的线程。而notifyAll会唤醒
所有正在等等待的线程。需要注意的是notify和notifyAll并不会释放对应的同步锁哦。
5) isAlive
检查线程是否处于执行状态。在当前线程执行完run方法之前调用此方法会返回true。
在run方法执行完进入死亡状态后调用此方法会返回false。
6)currentThread
Thread类中的方法,返回当前正在使用cpu的那个线程。
7)intertupt
吵醒因为调用sleep方法而进入休眠状态的方法,同时会抛出InterrruptedException哦。
8)join
线程联合 例如一个线程A在占用cpu的期间,可以让其它线程调用join()和本地线程联合。
简称联合线程。如果感兴趣的话可以自己在百度研究一下。这里不讲了...
好吧,今天就先到这里吧~
Java多线程中的常用方法的更多相关文章
- java多线程中的三种特性
java多线程中的三种特性 原子性(Atomicity) 原子性是指在一个操作中就是cpu不可以在中途暂停然后再调度,既不被中断操作,要不执行完成,要不就不执行. 如果一个操作时原子性的,那么多线程并 ...
- java 多线程中的wait方法的详解
java多线程中的实现方式存在两种: 方式一:使用继承方式 例如: PersonTest extends Thread{ String name; public PersonTest(String n ...
- java多线程中并发集合和同步集合有哪些?区别是什么?
java多线程中并发集合和同步集合有哪些? hashmap 是非同步的,故在多线程中是线程不安全的,不过也可以使用 同步类来进行包装: 包装类Collections.synchronizedMap() ...
- java多线程中最佳的实践方案是什么?
java多线程中最佳的实践方案是什么? 给你的线程起个有意义的名字.这样可以方便找bug或追踪.OrderProcessor, QuoteProcessor or TradeProcessor 这种名 ...
- Java多线程中的竞争条件、锁以及同步的概念
竞争条件 1.竞争条件: 在java多线程中,当两个或以上的线程对同一个数据进行操作的时候,可能会产生“竞争条件”的现象.这种现象产生的根本原因是因为多个线程在对同一个数据进行操作,此时对该数据的操作 ...
- Java多线程中的死锁
Java多线程中的死锁 死锁产生的原因 线程死锁是指由两个以上的线程互相持有对方所需要的资源,导致线程处于等待状态,无法往前执行. 当线程进入对象的synchronized代码块时,便占有了资源,直到 ...
- Java多线程中join、yield、sleep方法详解
在Java多线程编程中,Thread类是其中一个核心和关键的角色.因此,对该类中一些基础常用方法的理解和熟练使用是开发多线程代码的基础.本篇主要总结一下Thread中常用的一些静态方法的含义及代码中的 ...
- Java多线程中易混淆的概念
概述 最近在看<ThinKing In Java>,看到多线程章节时觉得有一些概念比较容易混淆有必要总结一下,虽然都不是新的东西,不过还是蛮重要,很基本的,在开发或阅读源码中经常会遇到,在 ...
- Java多线程中变量的可见性
之所以写这篇博客, 是因为在csdn上看到一个帖子问的就是这个问题. 废话不多说, 我们先看看他的代码(为了减少代码量, 我将创建线程并启动的部分修改为使用方法引用). 1 2 3 4 5 6 7 8 ...
随机推荐
- DATE_FORMAT() 函数用于以不同的格式显示日期/时间数据。
DATE_FORMAT(date,format) format参数的格式有 %a 缩写星期名 %b 缩写月名 %c 月,数值 %D 带有英文前缀的月中的天 %d 月的天,数值(00-31) %e 月的 ...
- java深入探究14-lucene
项目代码:链接:http://pan.baidu.com/s/1qXVcfCw 密码:apw1 01 回顾索引 定义:索引是对数据库表中一列或多列的值进行排序的一种结构 目的:加快对数据库表中记录的查 ...
- UVA 1638 Pole Arrangement (dp)
题意:有n个长度为1到n的柱子排列在一起,从左边看有l根从右边看有r根,问你所以排列中满足这种情况的方案数 题解:就是一个dp问题,关键是下标放什么,值代表什么 使用三维dp,dp[i][j][k]= ...
- Virtio SCSI设备介绍
Qemu的存储栈 在KVM虚拟化环境中,当客户机的内核存储系统像在物理机上一样通过页缓存.文件系统.通用块设备层运行到实际设备驱动时,这时驱动对设备寄存器的访问会触发CPU从客户机代码切换到物理机内的 ...
- hibernate报错org.hibernate.HibernateException: No CurrentSessionContext configured!
org.hibernate.HibernateException: No CurrentSessionContext configured! at org.hibernate.internal.Ses ...
- 我的博客搬家到https://www.w2le.com/了
大家以后想看我的博文的请到这里哦,欢迎大家访问https://www.w2le.com/
- MySQL索引分析
索引的出现解决数据量上升导致查询越来越慢的问题,优化数据的查询,提高查询的速度. 索引 定义: 通过各种数据结构实现的值到行位置的映射.快速定位与访问特定的数据. 作用: 提高访问速度 实现主键.唯一 ...
- andriod sdk 模拟器的安装以及root
安卓模拟器常用的一共2种java sdk 和 bluestacks 蓝手指.前者比较卡,后者貌似不能模拟2g/3g上网. 本文主要是针对java sdk的安装使用,以及root.关于root的意思 ...
- asp.net IE 页面刷新固定位置
MaintainScrollPositionOnPostback="true" 可能我们会经常遇到这种情况,当页面内容比较多的时候,当用户执行操作执行一次页面回送后,页面又重新从顶 ...
- 论文笔记 — L2-Net: Deep Learning of Discriminative Patch Descriptor in Euclidean Space
论文: 本文主要贡献: 1.提出了一种新的采样策略,使网络在少数的epoch迭代中,接触百万量级的训练样本: 2.基于局部图像块匹配问题,强调度量描述子的相对距离: 3.在中间特征图上加入额外的监督: ...