`
ilikeido
  • 浏览: 26777 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

重游java系列一线程 从搬运工开始

阅读更多
     java开发已经三年了,总感觉太浮躁。这些天静下心来,对这门语言小深入了一下,特撰写该系列。
    本篇内容以模拟现实场景为线索,主要针对java线程的同步以及线程池的应用。
    模拟场景:
     一家工厂有1000包大米(有编号)放在仓库,最近仓库进水了,老板请了100个农民工,打算搬到外面让太阳晒晒,民工速度有快有慢,工钱根据搬运的大米数量计算,大米随机搬运。
   
   import java.util.HashMap;
import java.util.Iterator;
import java.util.Random;
import java.util.Vector;

public class Test3 {

	public static void n(String[] args) {
		Vector<Goods> goodsList = new Vector<Goods>();//进货
		GoodFactory factory = new GoodFactory(goodsList);//仓库
		for (int i = 0; i < 1000; i++) {
			Goods goods = new Goods(i);
			goodsList.add(goods);
		}

		//ExecutorService service = Executors.newScheduledThreadPool(10);//如果仓库很小
		for (int i = 0; i < 100; i++) {
			Person person = new Person(factory, i);
			new Thread(person).start();
			//service.execute(person);
		}

		//service.shutdown();
		while (factory.getGoodsCount() != 0) {
		}
		Iterator<Integer> iterator = factory.counter.values().iterator();
		int count = 0;
		while (iterator.hasNext()) {
			count += iterator.next();
		}
		System.out.println("共搬了" + count + "件商品");
	}
}

/**
 * 模拟工厂 类
 * @author ilikeido
 *
 */
class GoodFactory {

	Vector<Goods> goodsQueue;//商品

	HashMap<Person, Integer> counter = new HashMap<Person, Integer>();//统计员

	public GoodFactory(Vector<Goods> goodsQueue) {
		this.goodsQueue = goodsQueue;
	}

	/**
	 * 随机搬货
	 * @param person	工人
	 * @return 
	 */
	public synchronized Goods moveRandom(Person person) {
		int old = goodsQueue.size();
		if (old > 0) {
			int index = 0;
			try {
				index = new Random().nextInt(old - 1);
			} catch (Exception e) {
			}
			Goods goods = goodsQueue.get(index);
			goodsQueue.remove(index);
			person.say(goods);
			if (counter.get(person) == null) {
				counter.put(person, 1);
			} else {
				counter.put(person, counter.get(person) + 1);
			}
			return goods;
		}
		return null;
	}

	public int getGoodsCount() {
		return goodsQueue.size();
	}
}

/**
 * 工人
 * @author ilikeido
 *
 */
class Person implements Runnable {

	GoodFactory factory;

	public static ThreadLocal<Integer> count = new ThreadLocal<Integer>() {
		@Override
		protected Integer initialValue() {
			return 1;
		}
	};

	int id;

	public Person(GoodFactory factory, int id) {
		this.factory = factory;
		this.id = id;
	}

	/**
	 * 搬货
	 */
	public void move() {
		factory.moveRandom(this);
		count.set(count.get().intValue() + 1);
	}

	@Override
	public void run() {
		while (factory.getGoodsCount() > 0) {
			move();
			count.set(count.get() + 1);
			try {
				Thread.sleep(new Random().nextInt(1000));
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

	public void say(Goods goods) {
		System.out.println(this.toString() + "搬运了" + goods.toString() + ",共搬了" + count.get() + "包");
	}

	public String toString() {
		return "工人" + id;
	}

}

/**
 * 商品
 * @author ilikeido
 *
 */
class Goods {

	int gflag;

	public Goods(int gflag) {
		this.gflag = gflag;
	}

	public String toString() {
		return "商品编号:" + gflag;
	}
}
分享到:
评论

相关推荐

    Java 模拟线程并发

    Java 模拟线程并发 Java, 模拟线程并发,线程,并发 Java, 模拟线程并发,线程,并发 Java, 模拟线程并发,线程,并发 Java, 模拟线程并发,线程,并发

    Java线程Java线程Java线程Java线程

    Java线程Java线程Java线程Java线程Java线程Java线程

    Java多线程编程总结

    Java 线程系列博文总结word化,编目如下,欢迎互相学习交流: Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:...

    java多线程编程总结

    Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 ...

    Java线程讲解Java线程讲解

    Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解

    Java的线程和Java AppletJava的线程和Java AppletJava的线程和Java Applet

    Java的线程和Java AppletJava的线程和Java AppletJava的线程和Java AppletJava的线程和Java AppletJava的线程和Java Applet

    线程 JAVA java线程 java线程第3版 java线程第2版第3版合集

    电子书相关:包含4个有关JAVA线程的电子书(几乎涵盖全部有关线程的书籍) OReilly.Java.Threads.3rd.Edition.Sep.2004.eBook-DDU Java Thread Programming (Sams) java线程第二版中英文 java线程第二版中英文 ...

    java多线程笔记

    Java线程:概念与原理 2 一、操作系统中线程和进程的概念 2 二、Java中的线程 3 三、Java中关于线程的名词解释 3 四、线程的状态转换和生命周期 4 Java线程:创建与启动 7 Java线程:线程名称的设定及获取 10 Java...

    java 线程java 线程

    java 线程java 线程java 线程java 线程java 线程java 线程java 线程java 线程java 线程

    Java线程详解大全

    Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程

    java多线程读取文件

    Java多线程读大文件 java多线程写文件:多线程往队列中写入数据

    JAVA单线程多线程

    单线程 单线程 单线程 单线程 单线程 单线程

    Java多线程设计模式上传文件

    Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式...

    Java多线程机制(讲述java里面与多线程有关的函数)

    Java多线程机制 9.1 Java中的线程 9.2 Thread的子类创建线程 9.3 使用Runable接口 9.4 线程的常用方法 9.5 GUI线程 9.6 线程同步 9.7 在同步方法中使用wait()、notify 和notifyAll()方法 9.8 挂起、恢复和终止线程 ...

    java多线程ppt

    java多线程PPT 多线程基本概念 创建线程的方式 线程的挂起与唤醒 多线程问题

    多线程启动.java多线程启动.java多线程启动.java

    多线程启动.java多线程启动.java多线程启动.java多线程启动.java

    JAVAJAVA多线程教学演示系统论文

    论文参考,JAVAJAVA多线程教学演示系统论文

    java 多线程操作数据库

    一个java 多线程操作数据库应用程序!!!

    Java的多线程(java基础)

    Java的多线程,对初学者有用,老师特别推荐的,希望对大家有用

    java多线程经典案例

    java多线程经典案例,线程同步、线程通信、线程阻塞等经典案例

Global site tag (gtag.js) - Google Analytics