- 浏览: 45590 次
- 性别:
- 来自: 北京
文章分类
最新评论
1.sleep
是Thread的静态方法,public static void sleep(long mililis) throws InterruptedException 使得当前线程处于休眠状态。Tread.sleep();
sleep() 允许指定以毫秒为单位的一段时间作为参数,它使得线程在指定的时间内进入阻塞状态,不能得到CPU 时间片,指定的时间一过,线程重新进入可执行状态。说白了 ,也就是把机会给其他线程,但是监控状态依然保持。重要的一点就是 当调用sleep()方法是 不会 释放对象锁的。
举例:
public class SleepTest implements Runnable { static int b = 100; public void run() { try { System.out.println("m1"); b--; Thread.sleep(5000); System.out.println("m1" + "Thread=" + Thread.currentThread().getName() + " " + this + " " + "b=:" + b); } catch (Exception e) { e.printStackTrace(); } } public static void main(String args[]) throws Exception { SleepTest ss = new SleepTest(); Thread tt = new Thread(ss); Thread tt1 = new Thread(ss); tt.start(); tt1.start(); } }
运行结果:
m1
m1
m1Thread=Thread-0 CopyOfsynchro@f62373 b=:98
m1Thread=Thread-1 CopyOfsynchro@f62373 b=:98
2.wait,notify,notifyall
是Object 类的方法。所有对象都拥有这一对方法。这一对方法阻塞时要释放占用的锁,而锁是任何对象都具有的,调用任意对象的 wait() 方法导致线程阻塞,并且该对象上的锁被释放。
notify()是释放对象的wait()方法而阻塞线程(但是也要当得到锁后才可以运行)但是这个释放是随机的,也就是不一定要释放那个线程。(因为调用同一资源的可能不是一个线程或者说是有多个阻塞的线程在等待,但是如果加了synchronized也只有一个线程,也有其他的线程在等待中,也就是阻塞)我们无法预料哪一个线程将会被选择,所以编程时要特别小心,避免因这种不确定性而产生问题。
除了 notify(),还有一个方法 notifyAll() 也可起到类似作用,唯一的区别在于,调用 notifyAll() 方法将把因调用该对象的 wait() 方法而阻塞的所有线程一次性全部解除阻塞。当然,只有获得锁的那一个线程才能进入可执行状态。但是这一对方法却必须在 synchronized 方法或块中调用,理由也很简单,只有在synchronized 方法或块中当前线程才占有锁,才有锁可以释放。
同样的道理,调用这一对方法的对象上的锁必须为当前线程所拥有,这样才有锁可以释放。因此,这一对方法调用必须放置在这样的 synchronized 方法或块中,该方法或块的上锁对象就是调用这一对方法的对象。若不满足这一条件,则程序虽然仍能编译,但在运行时会出现 IllegalMonitorStateException 异常。
举例:生产者与消费者
public class ProducerConsumer { public static void main(String args[]){ SyncStack ss = new SyncStack(); Producer p = new Producer(ss); Consumer c = new Consumer(ss); new Thread(p).start(); new Thread(c).start(); } } class WoTou{ int id ; public WoTou(int id){ this.id = id; } public String toString(){ return "WoTou:"+id; } } class SyncStack{ int index = 0; WoTou[] awtWT = new WoTou[6]; public synchronized void push(WoTou wt){ while(index == awtWT.length){ try { this.wait();//当前的正在访问对象的线程wait } catch (InterruptedException e) { e.printStackTrace(); } } this.notify(); awtWT[index] = wt; index ++; } public synchronized WoTou pop(){ while(index == 0){//if->while:如果catch住异常后,假如是if并且index=0,index == 0 不再判断,index--会执行, 程序错误。所以改为while,可以避免发生如此错误。 try { this.wait();//当前的正在访问对象的线程阻塞(wait),wait后对象的锁不归线程所有,直到"醒了"(notify,notifyALL),再重新找回锁。 } catch (InterruptedException e) { e.printStackTrace(); } } this.notify();//叫醒一个正在当前对象上wait的线程。 index--; return awtWT[index]; } } class Producer implements Runnable{ SyncStack ss = null; Producer(SyncStack ss){ this.ss = ss; } public void run() { for(int i=0;i<20;i++){ WoTou wt = new WoTou(i); ss.push(wt); System.out.println("Producer:"+wt); try { Thread.sleep((int)(Math.random()*100)); } catch (InterruptedException e) { e.printStackTrace(); } } } } class Consumer implements Runnable{ SyncStack ss = null; Consumer(SyncStack ss){ this.ss = ss; } public void run() { for(int i=0;i<20;i++){ WoTou wt = ss.pop(); System.out.println("Consumer:"+wt); try { Thread.sleep((int)(Math.random()*1000));//目的是让其他线程有执行的机会。 } catch (InterruptedException e) { e.printStackTrace(); } } } }
执行结果:
Producer:WoTou:0
Consumer:WoTou:0
Producer:WoTou:1
Producer:WoTou:2
Producer:WoTou:3
Producer:WoTou:4
Producer:WoTou:5
Producer:WoTou:6
Consumer:WoTou:6
Producer:WoTou:7
Producer:WoTou:8
Consumer:WoTou:7
Producer:WoTou:9
Consumer:WoTou:8
Consumer:WoTou:9
Producer:WoTou:10
Consumer:WoTou:10
Producer:WoTou:11
Consumer:WoTou:11
Producer:WoTou:12
Consumer:WoTou:12
Producer:WoTou:13
Consumer:WoTou:13
Producer:WoTou:14
Consumer:WoTou:14
Producer:WoTou:15
Consumer:WoTou:15
Producer:WoTou:16
Consumer:WoTou:16
Producer:WoTou:17
Consumer:WoTou:17
Producer:WoTou:18
Consumer:WoTou:18
Producer:WoTou:19
Consumer:WoTou:19
Consumer:WoTou:5
Consumer:WoTou:4
Consumer:WoTou:3
Consumer:WoTou:2
Consumer:WoTou:1
3.join
合并某个线程。(相当方法调用)
举例:
public class TestJoin implements Runnable { static int b = 100; public void run() { try { System.out.println("m1"); b--; System.out.println("m1" + "Thread=" + Thread.currentThread().getName() + " " + this + " " + "b=:" + b); } catch (Exception e) { e.printStackTrace(); } } public static void main(String args[]) throws Exception { TestJoin ss = new TestJoin(); Thread tt = new Thread(ss); Thread tt1 = new Thread(ss); tt.start(); tt.join(); //合并线程 tt1.start(); } }
运行结果:
m1
m1Thread=Thread-0 TestJoin@12b6651 b=:99
m1
m1Thread=Thread-1 TestJoin@12b6651 b=:98
4.yield
让出CPU给其他线程执行的机会。
举例:
public class TestYield extends Thread { public void run() { try { for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName() +"i=:" + i); if(i%10==0){ yield(); //让出线程执行 } } } catch (Exception e) { e.printStackTrace(); } } public static void main(String args[]) throws Exception { Thread tt = new TestYield(); Thread tt1 = new TestYield(); tt.start(); tt1.start(); } }
5.getPriority,setPriority
Java 提供一个线程调度器来监控程序中启动后就进入就绪状态的所有线程。线程调度器按照线程的优先级决定应调度哪个线程来执行。
线程的优先级用数字表示,范围从1到10,一个线程的缺省优先级是5。
Thread.MIN_PRIORITY = 1
Thread.MAX_PRIORITY=10
Thread.NORM_PRIORITY = 5
使用下述方法获得或设置线程对象的优先级。
int getPriority();
void setPriority(int nexPriority);
举例:
public class TestPriority extends Thread{ public void run() { try { for(int i=0;i<10;i++){ System.out.println("m1" + "Thread=" + Thread.currentThread().getName() + " " + this + " " + "i=:" + i); } } catch (Exception e) { e.printStackTrace(); } } public static void main(String args[]) throws Exception { Thread ss = new TestPriority(); Thread tt = new TestPriority(); ss.start(); tt.start(); tt.setPriority(Thread.NORM_PRIORITY + 4); } }
一种运行结果:
m1Thread=Thread-0 Thread[Thread-0,5,main] i=:0
m1Thread=Thread-1 Thread[Thread-1,9,main] i=:0
m1Thread=Thread-1 Thread[Thread-1,9,main] i=:1
m1Thread=Thread-1 Thread[Thread-1,9,main] i=:2
m1Thread=Thread-1 Thread[Thread-1,9,main] i=:3
m1Thread=Thread-1 Thread[Thread-1,9,main] i=:4
m1Thread=Thread-1 Thread[Thread-1,9,main] i=:5
m1Thread=Thread-1 Thread[Thread-1,9,main] i=:6
m1Thread=Thread-1 Thread[Thread-1,9,main] i=:7
m1Thread=Thread-1 Thread[Thread-1,9,main] i=:8
m1Thread=Thread-1 Thread[Thread-1,9,main] i=:9
m1Thread=Thread-0 Thread[Thread-0,5,main] i=:1
m1Thread=Thread-0 Thread[Thread-0,5,main] i=:2
m1Thread=Thread-0 Thread[Thread-0,5,main] i=:3
m1Thread=Thread-0 Thread[Thread-0,5,main] i=:4
m1Thread=Thread-0 Thread[Thread-0,5,main] i=:5
m1Thread=Thread-0 Thread[Thread-0,5,main] i=:6
m1Thread=Thread-0 Thread[Thread-0,5,main] i=:7
m1Thread=Thread-0 Thread[Thread-0,5,main] i=:8
m1Thread=Thread-0 Thread[Thread-0,5,main] i=:9
优先级高的运行时间长。
发表评论
-
java 参数传递
2012-06-22 13:00 0引用自:http://www.blogj ... -
log4j
2012-05-30 09:16 0Log4j配置详解 (2009-11-27 14: ... -
Commons-configuration设置读取属性文件
2012-05-14 13:02 0Commons-configuration-1.6设置属性 ... -
JAVA中关于静态(static)关键字的使用方法和内部类的调用 ,java基础
2011-07-03 18:54 0转载http://blog.csdn.net/xyf_84/a ... -
动态代理
2011-05-16 20:48 0(Dynamic Proxy)动态代理 ... -
Java中使用正则表达式
2011-05-01 17:08 0java正则表达式通过java.u ... -
初始化
2011-01-09 18:01 613引自:Thinking in Java 成员初始化:类 ... -
线程总结(线程的状态转换)
2010-12-17 15:09 578线程的状态转换:图片参照附件。 -
线程总结(线程的创建和启动的方法)
2010-12-17 10:24 3490转载:http://supportopensour ... -
线程总结(synchronized关键字)
2010-12-16 17:21 730一.Java的synchronized使用方法总结: 把sy ... -
java 静态初始化,动态初始化,以及构造器执行的顺序
2010-12-05 12:31 1378大家在去参加面试的时候,经常会遇到这样的考题:给你两个类的代码 ... -
对象排序:Comparator与Comparable的区别
2010-05-25 17:45 1576当集合中存储的都是对象时,我们要对其进行排序,就要借助 ...
相关推荐
Java线程中wait、await、sleep、yield、join用法汇总,文章里面总结了这些关键字的用法,并且里面带有源码帮助分析用法,此一文就可以理解这些关键字用法,推荐拥有
NULL 博文链接:https://coolfire9201207034819.iteye.com/blog/1660744
3.wait,notify和notifyAll只能在同步方法或同步代码块中调用,而sleep可以在任何地方调用; 4.sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常。(如果不是在同步方法或同步代码块中调用wait()方法,...
CSDN前辈众多,本文要说全部原创,那不现实,但本文绝对走肾之文,概念知识多来自前辈博文讲解,特此感谢。 文章末尾会给出本人学习过程中翻阅的优秀博文。 正文 给出一段准备代码,相信各位一看就懂,不懂,你不懂...
T03_Sleep_Yield_Join.java
线程的基本概念、线程类、任务类、线程优先级、sleep()方法(休眠)、yield()方法(礼让)、join方法(合并)、interrupt()方法(中断),线程的生命周期 线程 与 进程 的关系:**有一个进程中至少包含一个线程 **...
java 线程让步(Yield) java 线程让步(Yield) java 线程让步(Yield)
java中yieldsleep以及wait的区别.pdf
之前,我讨论了一个wait()和sleep()方法区别的问题,这一次,我将会讨论join()和yield()方法的区别。坦白的说,实际上我并没有用过其中任何一个方法,所以,如果你感觉有不恰当的地方,请提出讨论。 Java线程调度...
本压缩包,总共包含两个文档,JAVA多线程编程详解-详细操作例子和 Java... 例如,runnable、thread、stop()、 suspend、yield、setPriority()、getPriority()、synchronized、wait()、join、线程池同步阻塞等方法的介绍
Java线程中yield与join方法的区别Java开发Java经验技巧共6页.pdf.zip
高薪程序员面试题精讲系列63之说说sleep()、yield()、join()、wait()的区别.pdf,这是一份不错的文件
java线程分析java project例子,里面分析了sleep(),join(),yield()和wait以及notify等方法的使用以及需要注意的地方。
Java中的线程让步会让线程让出优先级,而休眠则会让线程进入阻塞状态等待被唤醒,这里我们对比线程等待的wait()方法,来详解Java中的线程让步yield()与线程休眠sleep()方法
暂停线程执行 sleep_yield_join_stop3.线程的优先级问题4.多线程的安全性问题5.线程同步1.同步代码块2.同步方法 1.线程操作的常用方法 序号 方法名称 描述 1 static Thread currentThread() 返回目前正在执行...
sleep方法和wait方法的区别 stop,suspend,resume等方法为什么会被遗弃 interrupt,interrupted,isInterrupted方法区别 join方法 yield方法 多线程 进程和线程 进程与线程最主要的区别是它们是操作系统管理资源的不同...
java线程分析android project例子,主要分析了sleep(),join(),yield()和wait()以及notify等方法以及需要注意的事项。
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
本文实例讲述了JavaScript使用yield模拟多线程的方法。分享给大家供大家参考。具体分析如下: 在python和C#中都有yield方法,通过yield可以实现很多多线程才能实现的功能。 对javascript有版本要求:JavaScript 1.7...
二、yield是一个语法糖,为方便开发者提供的一种方便方法 三、yield返回类型为IEnumerator、IEnumerable、IEnumerator、IEnumerable 四、如果返回类型为IEnumerator编译时会实现一个实现了IEnumerator接口的类 五、...