复习java线程,然后实现生产者与消费者问题,4个文件代码如下:
1.生产者:
/** * producer.java * xmlanalysis * 2011-8-26 */ package com.lyjilu.thread; import java.util.List; /** * @author dawn.liu 2011-8-26 上午10:54:22 */ public class Producer extends Thread { /** * */ public Producer() { } public Producer(String name) { this.Threadname = name; } public Producer(String name, List<Object> list) { this.list = list; this.Threadname = name; } /** * 用于标识线程 */ private String Threadname; /** * 要操作的list */ private List<Object> list; /* * (non-Javadoc) * * @see java.lang.Runnable#run() */ @Override public void run() { for (int i = 0; i < 10; i++) { synchronized (list) { list.add(Threadname + i); System.out.println("Producer[" + Threadname + "]: " + Threadname + i); try { list.notify(); list.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } System.out.println(Threadname + " is out"); } }
2、消费者:
/** * Customer.java * xmlanalysis * 2011-8-26 */ package com.lyjilu.thread; import java.util.List; /** * @author dawn.liu 2011-8-26 上午11:00:46 */ public class Customer extends Thread { private List<Object> list; public Customer() { } public Customer(List<Object> list) { this.list = list; } /* * (non-Javadoc) * * @see java.lang.Runnable#run() */ @Override public void run() { for (int i = 0; i < 1000; i++) { synchronized (list) { if (list.size() > 0) { Object o = list.get(list.size() - 1); list.remove(list.size() - 1); System.out.println("Customer : " + o); if (list.size() == 0) try { list.wait(100); } catch (InterruptedException e) { e.printStackTrace(); } list.notify(); } } } } }
3.公共资源类:
/** * ResourceList.java * xmlanalysis * 2011-8-26 */ package com.lyjilu.thread; import java.util.List; import java.util.Vector; /** * @author dawn.liu * 2011-8-26 上午10:58:47 */ public class ResourceList { public List<Object> list = new Vector<Object>(1000); }
4.最后是测试类:
/** * Main.java * xmlanalysis * 2011-8-26 */ package com.lyjilu.thread; import java.util.List; /** * @author dawn.liu * 2011-8-26 上午11:01:05 */ public class Main { /** * @param args */ public static void main(String[] args) { ResourceList res = new ResourceList(); List<Object> list = res.list; Producer p1 = new Producer("First",list); Producer p2 = new Producer("Second",list); Producer p3 = new Producer("Third",list); Producer p4 = new Producer("Fourth",list); Producer p5 = new Producer("Fifth",list); Producer p6 = new Producer("Sixth",list); Customer c = new Customer(list); p1.start(); p2.start(); p3.start(); p4.start(); p5.start(); p6.start(); c.start(); } }
采用通过唤醒与等待方式,作为学习备忘
要产生一个线程很简单,继承Thread 或实现 Runnable,
API例子的代码:
class PrimeThread extends Thread { long minPrime; PrimeThread(long minPrime) { this.minPrime = minPrime; } public void run() { // compute primes larger than minPrime . . . } } -------------------------------------------------------------------------------- 然后,下列代码会创建并启动一个线程: PrimeThread p = new PrimeThread(143); p.start();
第二种:
class PrimeRun implements Runnable { long minPrime; PrimeRun(long minPrime) { this.minPrime = minPrime; } public void run() { // compute primes larger than minPrime . . . } } -------------------------------------------------------------------------------- 然后,下列代码会创建并启动一个线程: PrimeRun p = new PrimeRun(143); new Thread(p).start();