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()和本地线程联合。
简称联合线程。如果感兴趣的话可以自己在百度研究一下。这里不讲了...
好吧,今天就先到这里吧~