java多线程:按顺序读数据
来源:优易学  2011-12-11 16:29:00   【优易学:中国教育考试门户网】   资料下载   IT书店

  以下内容是根据本人的一些业务逻辑来做的一个dome,应该有很多地方还不完善,请大家看到的朋友可以指点一下程序的错误.

  DBTest.java

  package test.thread.test;

  /**

  * 模拟一个数据库加载数据

  *

  */

  public class DBTest {

  /**

  * 模拟初使化从数据库中加次数据

  */

  public static void initListObject() {

  for (int i = 1; i <= 10; i++)

  ListPool.list.add("linkedList" + i);

  }

  /**

  * 模拟list数据快使用完成时,再到数据库中加载数据.

  *

  * @param count

  *            添加的个数

  */

  public static void addListObject(int count) {

  String str = ListPool.list.getLast().replaceAll("linkedList", "");

  int k = Integer.parseInt(str);

  for (int i = 1; i <= count; i++) {

  int j = k + i;

  ListPool.list.add("linkedList" + j);

  }

  System.out.println("增加list后的大小:" + ListPool.list.size());

  }

  /**

  * 删除list数据

  */

  public static void removeListObject() {

  ListPool.list.remove(0);

  System.out.println("删除一个list后的大小:" + ListPool.list.size());

  }

  }

    ===========================================================

  ListPool.java

  package test.thread.test;

  import java.util.LinkedList;

  public class ListPool {

  public static LinkedList<String> list = new LinkedList<String>();// 定义全局数据存放位置

  public final static int THREAD_COUNT = 10;// 定义最大启动线程个数

  }

  =============================================================

  DoSomething.java

  package test.thread.test;

  public class DoSomething implements Runnable {

  public void run() {

  try {

  while (true) {

  System.out.println("第一次得到大小:" + ListPool.list.size());

  while (ListPool.list.size() > 1) {// 必须保留最后一个,做为下一次更新时的起初id

  String info = "";

  synchronized (ListPool.list) {

  info = ListPool.list.get(0);

  DBTest.removeListObject();

  System.out.println("第二次得到大小:" + ListPool.list.size());

  if (ListPool.list.size() <= 5) {

  DBTest.addListObject(5);// 模拟从数据库中加载数据

  }

  }

  System.out.println(info);// 打印出内容,在现实中模拟到其它地方实现逻辑处理

  Thread.sleep((int) (Math.random() * 1000));//睡眠随机的毫秒,实现中可以改成1或者10毫秒,适当的释放资源给其它程序使用

  }

  System.out.println("测试执行");

  Thread.sleep(6 * 1000);

  DBTest.addListObject(5);

  }

  } catch (Exception e) {

  e.printStackTrace();

  }

  }

  }

  =================================================================

  TestMain.java

  import test.thread.test.DBTest;

  import test.thread.test.DoSomething;

  import test.thread.test.ListPool;

  public class TestMain {

  /**

  * @param args

  */

  public static void main(String[] args) {

  DBTest.initListObject();

  int threadCount = 1;

  try {

  while (threadCount < 1000) {// 必须保留最后一个,做为下一次更新时的起初id

  System.out.println("线程个数:" + threadCount);

  DoSomething doSomething = new DoSomething();

  Thread thread = new Thread(doSomething);

  //thread.setDaemon(true);//这里在tomcat或者其它的web应用程序方面启动线程时应该设置为true.在 tomcat关闭的时候,线程也应该关闭.因为用户线程是基于jvm的,如果不设置为true(守护线程),tomcat关闭的时候,线程还会在运行,那会消耗cpu与内存的.

  thread.setDaemon(false);//在main方法中,这里必须设置为用户线程.因为设置为守护线程时,main方法执行完毕线程也自动退出了,事实上程序还没有执行完成.

  thread.start();

  threadCount++;

  }

  } catch (Exception e) {

  e.printStackTrace();

  }

  }

  }

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训