Chinaunix首页 | 论坛 | 博客
  • 博客访问: 293513
  • 博文数量: 68
  • 博客积分: 1474
  • 博客等级: 上尉
  • 技术积分: 616
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-12 12:07
文章分类

全部博文(68)

文章存档

2011年(68)

分类: Java

2011-02-24 15:14:41

jdk1.5以后有了java.util.concurrent包

里面对同步提供了相当多的支持

例如lock atomic以及一些可同步操作的容器

下面给出一个常见的多线程面试题及其对应实现

有三个线程ID分别是A、B、C,请有多线编程实现,在屏幕上循环打印10次ABCABC

采用AtomicInteger来实现这个,

不多说了,上代码,还是相当简单易懂的

可以对concurrent包见一斑。。

  1. import java.util.concurrent.atomic.AtomicInteger;  
  2.   
  3. public class Print extends Thread{  
  4.     //专门为同步用的 用integer不行,每次都会新建的  
  5.     private AtomicInteger synObj;  
  6.     private int count;  
  7.     private String s;  
  8.     private int flag;  
  9.     private int total = 0;  
  10.       
  11.     public Print(int count,AtomicInteger atomicInteger,String s,int flag) {  
  12.         this.count = count;  
  13.         this.synObj = atomicInteger;  
  14.         this.s = s;  
  15.         this.flag = flag;  
  16.     }  
  17.     public void run() {  
  18.         while(true) {  
  19.             synchronized(synObj) {  
  20.                 if(synObj.intValue()%3 == flag) {  
  21.                     total++;  
  22.                     synObj.set(synObj.intValue()+1);  
  23.                     System.out.println(s);  
  24.                     synObj.notifyAll();  
  25.                     if(total == count) {  
  26.                         break;  
  27.                     }  
  28.                 }else {  
  29.                     try{  
  30.                         synObj.wait();  
  31.                     }catch(Exception e){  
  32.                         e.printStackTrace();  
  33.                     }  
  34.                 }  
  35.             }  
  36.         }  
  37.     }  
  38.     public static void main(String[]args) throws Exception {  
  39.         AtomicInteger synObj = new AtomicInteger(0);  
  40.         Print a = new Print(10,synObj,"A",0);  
  41.         Print b = new Print(10,synObj,"B",1);  
  42.         Print c = new Print(10,synObj,"C",2);  
  43.         a.start();  
  44.         b.start();  
  45.         c.start();  
  46.     }  
  47. }  
import java.util.concurrent.atomic.AtomicInteger; public class Print extends Thread{ //专门为同步用的 用integer不行,每次都会新建的 private AtomicInteger synObj; private int count; private String s; private int flag; private int total = 0; public Print(int count,AtomicInteger atomicInteger,String s,int flag) { this.count = count; this.synObj = atomicInteger; this.s = s; this.flag = flag; } public void run() { while(true) { synchronized(synObj) { if(synObj.intValue()%3 == flag) { total++; synObj.set(synObj.intValue()+1); System.out.println(s); synObj.notifyAll(); if(total == count) { break; } }else { try{ synObj.wait(); }catch(Exception e){ e.printStackTrace(); } } } } } public static void main(String[]args) throws Exception { AtomicInteger synObj = new AtomicInteger(0); Print a = new Print(10,synObj,"A",0); Print b = new Print(10,synObj,"B",1); Print c = new Print(10,synObj,"C",2); a.start(); b.start(); c.start(); } }


阅读(1970) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~