黑马程序员——Java基础---线程的另一个总结(4)--线程通信(互斥),线程范围的共享变量
2015-07-03 22:28
716 查看
1、写代码,思想很重要
2、如果实现状态转,线程唤醒时,使用while更好,可以防止伪唤醒
一道面试题:
子线程执行10次,然后主线程执行100次,如此交替50次
实现代码如下
想要每个线程使用自己个子线程数据,为每一个线程创建map并赋值,调用每一个线程时,使用对应线程map中的值
还可以使用java提供的类ThreadLocal
2、如果实现状态转,线程唤醒时,使用while更好,可以防止伪唤醒
一道面试题:
子线程执行10次,然后主线程执行100次,如此交替50次
实现代码如下
public class TroditionalThreadCom { public static void main(String[] args) { final Busness bus = new Busness(); new Thread(new Runnable() { @Override public void run() { for(int i = 1;i<50;i++){ bus.sub(); } } }).start(); for(int i = 1;i<50;i++){ bus.main(); } } }
public class Busness { private Boolean flag = true; public synchronized void sub() { if(!flag){ try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } for(int i =1;i<10;i++){ System.out.println("sub"+Thread.currentThread().getName()); } flag = false; this.notify(); } public synchronized void main() { if(flag){ try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } for(int i =1;i<100;i++){ System.out.println("main thread"+Thread.currentThread().getName()); } flag=true; this.notify(); } }
想要每个线程使用自己个子线程数据,为每一个线程创建map并赋值,调用每一个线程时,使用对应线程map中的值
public class ThreadScopeShareData { private static int data = 0; private static Map<Thread, Integer> threadData = new HashMap<Thread, Integer>(); public static void main(String[] args) { for(int i=0;i<2;i++){ new Thread(new Runnable(){ @Override public void run() { int data = new Random().nextInt(); System.out.println(Thread.currentThread().getName() + " has put data :" + data); threadData.put(Thread.currentThread(), data); new A().get(); new B().get(); } }).start(); } } static class A{ public void get(){ int data = threadData.get(Thread.currentThread()); System.out.println("A from " + Thread.currentThread().getName() + " get data :" + data); } } static class B{ public void get(){ int data = threadData.get(Thread.currentThread()); System.out.println("B from " + Thread.currentThread().getName() + " get data :" + data); } } }
还可以使用java提供的类ThreadLocal
public class ThreadLoclTest { private static ThreadLocal<Integer> x = new ThreadLocal<Integer>(); public static void main(String[] args) { for(int i =0;i<2;i++){ new Thread(new Runnable() { @Override public void run() { int data = new Random().nextInt(); System.out.println(Thread.currentThread().getName() + " has put data :" + data); x.set(data); new A().get(); new B().get(); } }).start(); } } static class A{ public void get(){ int data = x.get(); System.out.println("A from " + Thread.currentThread().getName() + " get data :" + data); } } static class B{ public void get(){ int data = x.get(); System.out.println("B from " + Thread.currentThread().getName() + " get data :" + data); } } }
相关文章推荐
- 2015_06月底面试问题总结
- 程序员的道法术器势
- 黑马程序员——Java基础--集合(三)
- Java程序员的Golang入门指南(下)
- Java程序员的Golang入门指南(下)
- 黑马程序员---其他对象
- 黑马程序员——单例设计模式
- 面试10大算法汇总
- 【超级经典】程序员装B指南
- 黑马程序员——迭代器
- 程序员面试笔试宝典学习记录(二)(程序设计相关知识)
- 面试
- 黑马程序员--Foundation框架基础
- 著名的互联网企业的面试笔试真题
- 前端面试浅谈
- 【剑指offer】面试题23:从上往下打印二叉树
- 【剑指offer】面试题22:栈的压入、弹出序列
- 黑马程序员----OC学习NSString使用方法
- hadoop面试题总结1
- 程序员黑科技之夺宝岛