本文将带你讲诉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多线程中的常用方法的更多相关文章

  1. java多线程中的三种特性

    java多线程中的三种特性 原子性(Atomicity) 原子性是指在一个操作中就是cpu不可以在中途暂停然后再调度,既不被中断操作,要不执行完成,要不就不执行. 如果一个操作时原子性的,那么多线程并 ...

  2. java 多线程中的wait方法的详解

    java多线程中的实现方式存在两种: 方式一:使用继承方式 例如: PersonTest extends Thread{ String name; public PersonTest(String n ...

  3. java多线程中并发集合和同步集合有哪些?区别是什么?

    java多线程中并发集合和同步集合有哪些? hashmap 是非同步的,故在多线程中是线程不安全的,不过也可以使用 同步类来进行包装: 包装类Collections.synchronizedMap() ...

  4. java多线程中最佳的实践方案是什么?

    java多线程中最佳的实践方案是什么? 给你的线程起个有意义的名字.这样可以方便找bug或追踪.OrderProcessor, QuoteProcessor or TradeProcessor 这种名 ...

  5. Java多线程中的竞争条件、锁以及同步的概念

    竞争条件 1.竞争条件: 在java多线程中,当两个或以上的线程对同一个数据进行操作的时候,可能会产生“竞争条件”的现象.这种现象产生的根本原因是因为多个线程在对同一个数据进行操作,此时对该数据的操作 ...

  6. Java多线程中的死锁

    Java多线程中的死锁 死锁产生的原因 线程死锁是指由两个以上的线程互相持有对方所需要的资源,导致线程处于等待状态,无法往前执行. 当线程进入对象的synchronized代码块时,便占有了资源,直到 ...

  7. Java多线程中join、yield、sleep方法详解

    在Java多线程编程中,Thread类是其中一个核心和关键的角色.因此,对该类中一些基础常用方法的理解和熟练使用是开发多线程代码的基础.本篇主要总结一下Thread中常用的一些静态方法的含义及代码中的 ...

  8. Java多线程中易混淆的概念

    概述 最近在看<ThinKing In Java>,看到多线程章节时觉得有一些概念比较容易混淆有必要总结一下,虽然都不是新的东西,不过还是蛮重要,很基本的,在开发或阅读源码中经常会遇到,在 ...

  9. Java多线程中变量的可见性

    之所以写这篇博客, 是因为在csdn上看到一个帖子问的就是这个问题. 废话不多说, 我们先看看他的代码(为了减少代码量, 我将创建线程并启动的部分修改为使用方法引用). 1 2 3 4 5 6 7 8 ...

随机推荐

  1. POI技术实现对excel的导出

    需求:客户端传来两个参数,当前页码和每页的条数,根据传来的参数实现对数据的导出 1.导入依赖 <!-- 报表相关 --> <dependency> <groupId> ...

  2. springboot - web项目

    一:使用Thymeleaf:参考http://blog.csdn.net/u012702547/article/details/53784992#t0 1.1 引入相应的包 1.2  thymelea ...

  3. js,java,ajax实现跨域访问及其原理

    http://blog.csdn.net/saytime/article/details/51540876 这篇文章对跨域访问做了较为细致得分析,我这里做下简单总结 1.实现跨域访问原理: 浏览器由于 ...

  4. 在eclipse中使用Github进行单元测试

    时间分配是找资料60%,动手实践40%.因为之前一直没怎么好好学习,导致看到使用Gunit进行单元测试的时候感觉像是看到了一行符号一样不知所措,还好现在搜索引擎很强大,找资料学习中间有找到一个现成的傻 ...

  5. linux--svn checkout

    svn --username=yourname co svn_path local_path

  6. cpu和gpu的区别和联系是什么

    cpu和gpu的区别和联系是什么 一.总结 一句话总结:CPU:复杂任务,核少,做串行,计算能力只是CPU很小的一部分,处理复杂逻辑: GPU:简单任务,核多,做并行(大吞吐量),做显卡的图象单元计算 ...

  7. unity监测按下键的键值并输出+unity键值

    using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using U ...

  8. sikiA计划问题记录

    1.有时候在场景中创建光源会有一条虚线 解决方法:禁用锯齿 edit - project setting - quality - anti aliasing

  9. 2017-03-05 CentOS中结合Nginx部署dotnet core Web应用程序

    Visual Studio Live 倒计时2天,当然这是美国倒计时两天,中国应该是在3月8日的凌晨,正值"3.8妇女节".提前祝广大的女性同志节日快乐,当然还有奋斗在一线的程序媛 ...

  10. 防止php重复提交表单更安全的方法

    Token.php <?php /* * Created on 2013-3-25 * * To change the template for this generated file go t ...