Chinaunix首页 | 论坛 | 博客
  • 博客访问: 10128
  • 博文数量: 4
  • 博客积分: 265
  • 博客等级: 二等列兵
  • 技术积分: 50
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-22 21:59
文章分类
文章存档

2011年(1)

2009年(3)

我的朋友
最近访客

分类: Java

2009-12-17 21:22:48

   来这边实习块快个月了,今晚突然想把前面学到的东西做个总结,其实也不算是总结,只能算是个人学习的一点体会,先把今天学习的线程说一下吧。
1,首先得知道线程的几个状态:
 线程的创建,就绪,运行,阻塞,消亡 五种状态。
ps:线程的创建一般有2种方式,1是继承Thread类 ;2是实现Runnable接口。
2,线程的同步(Synchronized)
 比如,在一个火车售票系统中,同时多个窗口售票,临界资源的使用和释放。
3,线程间的通信
 就如操作系统中的生产者和消费者的关系,要先放了,才能拿走,也是一个临界资源的占用和释放问题。
 
下面就拿实际的程序来看,相信能有更深刻的体会的:
 
package Thread;

public class Threadproductandconsumer {
  
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  produceandconsumeThread pct=new produceandconsumeThread();
  ProduceThread pt=new ProduceThread(pct);
  ConsumeThread ct=new ConsumeThread(pct);
  Thread p=new Thread(pt);
  Thread c=new Thread(ct);
  p.start();
  c.start();
  
 }
}
class produceandconsumeThread {
 String[] s =new String[2];
 String s1 = "重庆";
 String s2 = "===>西南大学";
 String s3 = "北京";
 String s4 = "===>北京大学";
 int flag=0;
 
 public void sleep() {
  int r = (int) (Math.random() * 500);
  try {
   Thread.sleep(r);
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
 public synchronized void produce() {
  for (int i = 0; i < 10; i++) {
   while (flag == 1) {
    try {
     wait();// 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
    } catch (InterruptedException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
   if (i % 2 == 0) {
    s[0] = s1;
    sleep();
    s[1] = s2;
    flag = 1;
    notify();// 唤醒在此对象监视器上等待的单个线程。
   } else {
    s[0] = s3;
    sleep();
    s[1] = s4;
    flag = 1;
    notify();
   }
  }
 }
 public synchronized void consume() {
  sleep();
  for (int k = 0; k < 10; k++) {
   while (flag == 0) {
    try {
     wait();
    } catch (InterruptedException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
   System.out.print(s[0]);
   sleep();
   System.out.print(s[1]);
   System.out.print("\n");
   flag = 0;
   notify();
  }
 }
}
class ProduceThread implements Runnable {
 private produceandconsumeThread pc1;
 public ProduceThread(produceandconsumeThread pc) {
  this.pc1 = pc;
 }
 public void run() {
  // TODO Auto-generated method stub
  pc1.produce();
 }
}
class ConsumeThread implements Runnable {
 private produceandconsumeThread pc2;
 public ConsumeThread(produceandconsumeThread pc) {
  this.pc2 = pc;
 }
 public void run() {
  // TODO Auto-generated method stub
  pc2.consume();
 }
}
 
阅读(737) | 评论(2) | 转发(0) |
0

上一篇:没有了

下一篇:实训---学习Oracle DB10g 之心得

给主人留下些什么吧!~~

chinaunix网友2009-12-17 22:11:10

抢占沙发~~

chinaunix网友2009-12-17 21:32:05

沙发~~~~