本文将带你讲诉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. Linux 修改DNS解决 Could not retrieve mirrorlist" 报错

    CentOS yum有时出现“Could not retrieve mirrorlist ”的解决办法——resolv.conf的配置 或者IP配置文件上写入 缺少DNS引起的问题1. 无法识别域名 ...

  2. ubuntu 下使用vi时方向键乱码,退格键不能使用

    ubuntu 下使用vi时方向键乱码,退格键不能使用的解决方法 问题表现:Ubuntu下,初始使用vi,编辑模式下使用方向键的时候,并不会使光标移动,而是在命令行中出现A B C D 之类的字母,并且 ...

  3. Ceph简介

    最近偶尔接触到云计算,开始对云计算感兴趣,希望能够早日加入这个计算机领域的第三次革命中去. 估计这次革命要持续二十年,也就是这辈子一直干云计算都没问题. 先了解一下Ceph吧.本博文主要是根据文献[1 ...

  4. Codeforces Round #275 (Div. 2) D

    题意 : 一个数组 给出m个限制条件 l r z 代表从l 一直 & 到 r 为 z  问能否构造出这种数组 如果可以 构造出来 因为 n m 都是1e5 而l r 可能输入进去就超时了 所以 ...

  5. ios点击事件失效

    当使用委托给一个元素添加click事件时,如果事件是委托到 document 或 body 上,并且委托的元素是默认不可点击的(如 div, span 等),此时 click 事件会失效. 解决办法有 ...

  6. sqlserver设置具体的访问权限

    为具体的用户设置具体的访问权限 收藏 use 你的库名 go --新增用户 exec sp_addlogin 'test' --添加登录 exec sp_grantdbaccess N'test' - ...

  7. UML类图(三)-------实例

    实例分析1——登录模块 某基于C/S的即时聊天系统登录模块功能描述如下: 用户通过登录界面(LoginForm)输入账号和密码,系统将输入的账号和密码与存储在数据库(User)表中的用户信息进行比较, ...

  8. mindmanager思维导图软件

    Mindjet 由原名 Mindjet MindManager 简化而来,是倍受赞誉.最好的思维导图软件.所谓思维导图实际上就是一种将你的思想具体化,把你的思维分析整理为有计划有条理的导向图的工作管理 ...

  9. hdu3157有源汇上下界最小流

    题意:有源汇上下界最小流裸题,主要就是输入要用字符串的问题 #include<bits/stdc++.h> #define fi first #define se second #defi ...

  10. 字符集、字符编码、XML中的中文编码

    字符集.字符编码.XML中的中文编码 作为程序员的你是不是对于ASCII .UNICODE.GB2321.UTF-7.UTF-8等等不时出现在你面前的这些有着奇怪意义的词感到很讨厌呢,是不是总觉得好象 ...