摘要:
线程交互知识点需要从JAVA.lang.Object的类的三个方法来学习Void notify():唤醒在此对象监视器上等待的单个线程Void notifyAll():唤醒在此对象监视器上等待的所有线程Void wait():导致当前的线程等待,直到其他线程调用此对象的notify()方法或notifAll()方法Wait(),notify(),notifyAll()都是Object的实例方法。与每个对象具有锁一样,每个对象可以有一个线程列表,他们等待来自该信号(通知)。线程通过执行对象上的wait()方法获得这个等待列表。从那时起,他不在执行任何其他指令,直到调用对象的notify()方法为 阅读全文
摘要:
线程互斥是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。/** * 线程间的互斥 * @author MrRock * */public class TraditionalThreadSynchronized { public static void main(String[] args) { new TraditionalThreadSynchronized().init(); } void init(){ final Outputer out = new Outputer(); //线程1 new Th... 阅读全文
摘要:
ThreadLocal详细介绍:http://www.cnblogs.com/ieage/archive/2012/05/16/2505426.htmlimport java.util.Random;/** * 通过单列模式将ThreadLocal屏蔽,这样每个线程的对象的数据都不会出产生重复 * 把数据封装成一个类,这样可以保存多个数据,每个数据用单列模式和ThreadLocal保证了对象在同一个线程共享不会产生混乱 * @author MrRock * */public class ThreadLocalByObject { public static void main(String[] 阅读全文
摘要:
当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。ThreadLocal类接口很简单,只有4个方法,我们先来了解一下: 1. void set(Object value) //设置当前线程的线程局部变量的值。 2. public Object get() //该方法返回当前线程所对应的线程局部变量。 3. public void remove() //将当前线程局部变量的值删除,目的是为了减少内存的占用,该方法是JDK 5.0新增的方法。需要指出的是,当线程结束后,对 阅读全文
摘要:
import java.util.HashMap;import java.util.Map;import java.util.Random;/** * 同一个线程(同一个Thread.currentThread())共享同一份数据,不同线程数据不同 * @author MrRock *运行结果 * Main--->Thread-0 data is : -90400073 threadA--->Thread-0 data is : -90400073 threadB--->Thread-0 data is : -90400073 Main--->Thread-1 data 阅读全文
摘要:
第一种,用Thread子类创建Thread thread = new Thread(){ @Override public void run() { while(true){ try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); ... 阅读全文
摘要:
Thread.sleep(n); 作用是让当前线程睡眠n毫秒,以便执行其他线程,如果没有其他线程,那睡眠n毫秒后,继续执行。 如果n=0,Sleep(0)是指CPU交出当前线程的执行权,让CPU去执行其他线程。也就是放弃当前线程的时间片,转而执行其他线程。一般来说以下情况应该使用sleep(0)1.当前线程比较耗时比较占CPU资源,可以在结尾处加上Sleep(0), 这样效率会得到大大的提高。2.线程池工作时,主线程使用Sleep(0)来等待线程池里所有的线程都完成运行。当线程池线程非常多的时候,这种方法确实是一种非常有效的节省cpu的方式,因为它节省了在线程里使用内核来进行同步的开销。 阅读全文