- 浏览: 533657 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
c__海棠依旧:
很强,对于我这个新手很容易理解,准们登录来给你点赞的!
BeanFactory和FactoryBean -
hudazheng:
很清晰!
X86、X64和X86_64区别 -
hugh.wang:
...
BeanFactory和FactoryBean -
CB00J:
...
Executor框架和线程池 -
Arbow:
请教一个问题。现在互联网业务的数据库通常用分片方式来连接一组数 ...
BoneCP源码——概述
1、wait
public final void wait(long timeout) throws InterruptedException
此方法为Object类的方法,在其他线程调用此对象的 notify()
方法或 notifyAll()
方法,或者超过指定的时间量前,导致当前线程等待。当前线程必须拥有此对象监视器,也就是当前线程必须要有此对象的锁,该方法必须写在synchronized修饰的方法里或synchronized同步代码块里, 否则将抛出运行时异常IllegalMonitorStateException,wait()方法相当于wait(0)方法。
2、notify
public final void notify()
此方法为Object类中的方法,唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的,并在对实现做出决定时发生。线程通过调用其中一个
wait
方法,在对象的监视器上等待。 该方法必须写在synchronized修饰的方法里或synchronized同步代码块里, 否则将抛出运行时异常IllegalMonitorStateException。
public final void notifyAll()
唤醒在此对象监视器上等待的所有线程。线程通过调用其中一个 wait
方法,在对象的监视器上等待。
如http://chenzehe.iteye.com/admin/blogs/1550701中的代码:
public class Info { private String country; private String city; private boolean flag = true; // true表示可以生产,但不能消费,false表示可以消费,但不能生产 public synchronized void set(String country, String city) { if (!flag) { try { super.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } this.country = country; try { Thread.sleep(300); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } this.city = city; this.flag = false; super.notify(); } public synchronized void get() { if (flag) { try { super.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println("country:" + this.country + "->city:" + this.city); this.flag=true; super.notify(); } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } }
3、join
public final void join(long millis) throws InterruptedException
是Thrad类中的方法,等待该线程终止的时间最长为millis
毫秒。超时为 0
意味着要一直等下去。public final void join()相当于join(0)。也就是使异步执行的线程变成同步,即等到该线程执行完成返回才往下执行下面代码。
如http://chenzehe.iteye.com/admin/blogs/1741137中代码:
public class MyRunnable implements Runnable { public static volatile int n = 0; public void run() { for (int i = 0; i < 10; i++) { try { n = n + 1; Thread.sleep(10); } catch (Exception e) { // TODO: handle exception } } } } public class MainTest { public static void main(String[] args) throws Exception { Thread[] threads = new Thread[100]; // 创建100个线程 for (int i = 0; i < threads.length; i++) { threads[i] = new Thread(new MyRunnable()); } // 启动100个线程 for (int i = 0; i < threads.length; i++) { threads[i].start(); } // 让100个线程都执行完 for (int i = 0; i < threads.length; i++) { threads[i].join(); } System.out.println(MyRunnable.n); } }
下面代码为join()的实现代码,发现join()也为synchronized方法,并且是调用wait()来实现的:
public final synchronized void join(long millis) throws InterruptedException { long base = System.currentTimeMillis(); long now = 0; if (millis < 0) { throw new IllegalArgumentException("timeout value is negative"); } if (millis == 0) { while (isAlive()) { wait(0); } } else { while (isAlive()) { long delay = millis - now; if (delay <= 0) { break; } wait(delay); now = System.currentTimeMillis() - base; } } }
4、sleep
public static void sleep(long millis) throws InterruptedException
Thread类中的方法,在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。该线程不丢失任何监视器的所属权。使当前线程暂停执行一段时间,让其它线程有机会执行,但它并不释放当前锁,其它线程仍不能访问共享数据。
5、yield
Thread类中的方法,与sleep类似,只是不能由用户定义多长时间,并且yield()只能让具有同优先级的程序有执行的机会。
发表评论
-
Java读取文件中单词进行排序并写到另一个文件中
2013-12-04 11:12 4719支持 http://ifeve.com/tao-code-m ... -
BoneCP源码——BoneCP中使用的第三方包 jsr166y、 LinkedTransferQueue队列、fork-join框架
2013-03-18 19:06 3411BoneCP主要使用了 ... -
redis 集群系统
2013-03-15 10:59 0redis 集群系统 -
BoneCP源码——BoneCP中使用的多线程
2013-03-16 17:53 39121、asyncExecutor 可缓存线程池,用于异步的创建 ... -
面试题——在一个文本里有N多个数据,使用多线程最快求和
2013-03-08 13:51 5404思路:把所有数据分组,每组使用一个线程去计算结果,计算完后 ... -
面试题——在多线程环境下如何保证一个List集合中的元素不超过15个
2013-02-22 19:16 4949这是有一次去面试被问到的,当时只知道用synchroniz ... -
阻塞队列BlockingQueue
2013-02-04 15:16 17001、队列Queue介绍 Queue是JDK1.5引入的接 ... -
Java 并发集合ConcurrentHashMap
2013-02-01 18:00 3540ConcurrentHashMap是JDK1.5并发包中提 ... -
Java 并发集合CopyOnWriteArrayList
2013-01-30 21:22 35551、Java在JDK1.5之前基本上对所有集合都实现了线程 ... -
携带结果的任务Callable和Future
2013-01-21 21:37 1673Executor框架使用Runnable作为基本的 ... -
线程池的使用
2013-01-17 18:23 1886线程池实现类ThreadPoolExecutor ... -
Executor框架和线程池
2013-01-15 21:08 6572简介 在JDK5后主 ... -
同步工具类之Exchanger
2013-01-11 17:11 1115Exchanger<V>,java.uti ... -
同步工具类之CyclicBarrier循环的barrier
2013-01-11 15:39 1426CyclicBarrier在java.util.c ... -
同步工具类之CountDownLatch倒数计数器
2013-01-10 20:59 3516CountDownLatch类在java.u ... -
同步工具类之Semaphore 信号量
2013-01-10 17:24 1554Semaphore可以维护 ... -
Java锁机制
2013-01-09 20:26 22931内置锁 Java提供了一种内置的锁机制来支持原子 ... -
非阻塞同步机制与CAS操作
2013-01-05 21:20 14053锁的劣势 Java在JDK1.5之前都是靠syn ... -
java.util.concurrent.atomic原子操作类包
2013-01-04 20:04 16139这个包里面提供了一组原子变量类。其基本的特性就是在 ... -
Java并发包java.util.concurrent简介
2012-12-06 19:53 3194JDK从1.5在多线程编程中提供了并发包java.u ...
相关推荐
分享的多线程技术不是告诉你什么是线程,线程的状态,而是我们在开发中容易踩的坑,受过的伤害。我不会告诉你什么是爱情,但是我会告诉你爱过。 一 基础: 1,Thread.sleep(0)的作用 2,为什么线程会带来性能问题 3...
多线程锁 并发下的集合类 List Set Map Callable接口 线程创建的方式 callable / runnable FutureTask JUC常用辅助类 CountDownLatch (减少计数器) CyclicBarrier(加法计数器) Semaphore(信号量,流量控制) ...
【多线程】sleep()和wait()分别是哪个类的方法,有什么区别? 79 【多线程】sleep()和yield()的区别 79 【多线程】对synchronized理解?用在代码块和方法上有什么区别? 80 【多线程】Volatile的理解 82 【*多线程】...
update() 在线程同步中,为了唤醒另一个等待的线程,使用下列方法 () [单选题] * A.sleep() B.wait() C.notify()(正确答案) D. join() Java高级程序设计测试含答案全文共40页,当前为第4页。Java提供以下哪个...
│ 高并发编程第二阶段04讲、多线程的休息室WaitSet详细介绍与知识点总结.mp4 │ 高并发编程第二阶段05讲、一个解释volatile关键字作用最好的例子.mp4 │ 高并发编程第二阶段06讲、Java内存模型以及CPU缓存不一致...
│ 高并发编程第二阶段04讲、多线程的休息室WaitSet详细介绍与知识点总结.mp4 │ 高并发编程第二阶段05讲、一个解释volatile关键字作用最好的例子.mp4 │ 高并发编程第二阶段06讲、Java内存模型以及CPU缓存不一致...
A.sleep() B.notify() C.wait() D.join() 正确答案:B 您的答案: 本题解析: 暂无解析 2.以下标识符中,不是Java语言关键字的是()。 A.wait B.new C.long D.switch 正确答案:A 您的答案: 本题解析: 暂无解析 3....
LeetCode判断字符串是否循环 知识点总结 java基础 1、使用迭代器和for each循环查看集合元素时只能获得元素的值,不能改变元素 ...object的方法:wait(notify,notifyall),thread的方法:(sleep、join),结束
Java程序.............................................................................................6 1.3.1 Java程序的结构 ...........................................................................
25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................
25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................