任何游戏都至少需要运行两个线程,主线程和gui线程

而线程池是一个管理运行线程的有用工具,下面的代码示范了一个线程池的实现方法~~

************************************************

(threadpool.java)

import java.util.linkedlist;

/**

线程池是一组线程,限制执行任务的线程数

*/

public class threadpool extends threadgroup {

private boolean isalive;

private linkedlist taskqueue;

private int threadid;

private static int threadpoolid;

/**

创建新的线程池,numthreads是池中的线程数

*/

public threadpool(int numthreads) {

super("threadpool-" + (threadpoolid++));

setdaemon(true);

isalive = true;

taskqueue = new linkedlist();

for (int i=0; i

new pooledthread().start();

}

}

/**

请求新任务。人物在池中下一空闲线程中运行,任务按收到的顺序执行

*/

public synchronized void runtask(runnable task) {

if (!isalive) {

throw new illegalstateexception();//线程被关则抛出illegalstateexception异常

}

if (task != null) {

taskqueue.add(task);

notify();

}

}

protected synchronized runnable gettask()

throws interruptedexception

{

while (taskqueue.size() == 0) {

if (!isalive) {

return null;

}

wait();

}

return (runnable)taskqueue.removefirst();

}

/**

关闭线程池,所有线程停止,不再执行任务

*/

public synchronized void close() {

if (isalive) {

isalive = false;

taskqueue.clear();

interrupt();

}

}

/**

关闭线程池并等待所有线程完成,执行等待的任务

*/

public void join() {

//告诉等待线程线程池已关

synchronized (this) {

isalive = false;

notifyall();

}

// 等待所有线程完成

thread[] threads = new thread[activecount()];

int count = enumerate(threads);

for (int i=0; i

try {

threads[i].join();

}

catch (interruptedexception ex) { }

}

}

/**

用于进行任务的线程

*/

private class pooledthread extends thread {

public pooledthread() {

super(threadpool.this,

"pooledthread-" + (threadid++));

}

public void run() {

while (!isinterrupted()) {

// 得到任务

runnable task = null;

try {

task = gettask();

}

catch (interruptedexception ex) { }

// 若gettask()返回null或中断,则关闭此线程并返回

if (task == null) {

return;

}

// 运行任务,吸收异常

try {

task.run();

}

catch (throwable t) {

uncaughtexception(this, t);

}

}

}

}

}

*********************************************

要测试这个线程池,可以通过下面这个test程序!

*********************************************

(threadpooltest.java)

public class threadpooltest {

public static void main(string[] args) {

if (args.length != 2) {

system.out.println("tests the threadpool task.");

system.out.println(

"usage: java threadpooltest numtasks numthreads");

system.out.println(

" numtasks – integer: number of task to run.");

system.out.println(

" numthreads – integer: number of threads " +

"in the thread pool.");

return;

}

int numtasks = integer.parseint(args[0]);

int numthreads = integer.parseint(args[1]);

// 生成线程池

threadpool threadpool = new threadpool(numthreads);

// 运行任务

for (int i=0; i

threadpool.runtask(createtask(i));

}

// 关闭线程池并等待所有任务完成

threadpool.join();

}

/**

一个简单的任务(打印id)

*/

private static runnable createtask(final int taskid) {

return new runnable() {

public void run() {

system.out.println("task " + taskid + ": start");

// 增加耗时

try {

thread.sleep(500);

}

catch (interruptedexception ex) { }

system.out.println("task " + taskid + ": end");

}

};

}

}

******************************************************

这样的线程池可以在许多地方应用!

java线程池游戏代码,Java游戏起步:(一)线程与线程池-JSP教程,Java技巧及代码...相关推荐

  1. java指定sql生成xml,用Java实现可保存状态的数据库生成XML树(8)-JSP教程,Java与XML...

    4.ejb-jar.xml文件 //sun microsystems, inc.//dtd enterprise javabeans 1.1//en http://java.sun.com/j2ee/ ...

  2. java源代码连接jsp,java网络五子棋的源代码-JSP教程,Java技巧及代码

    下面的源代码分为4个文件: chessclient.java:客户端主程序. chessinterface.java:客户端的界面. chesspad.java:棋盘的绘制. chessserver. ...

  3. java程序获取外部java程序的控件,将 Java 小程序迁移到 Microsoft J# 浏览器控件-JSP教程,Java技巧及代码...

    visual j# .net 小组 microsoft corporation 摘要:通过 microsoft j# 浏览器控件,开发人员可以将所编写的在 java 虚拟机上运行的 java 小程序迁 ...

  4. java基础学不会,转:《学不会的JAVA,消不了的忧愁》之四-JSP教程,Java基础

    <学不会的java,消不了的忧愁>之四--献给那些酷爱计算机编程的人们 发言者:jigenghua 时 间:2001/03/12 23:01:47 来 自:www.javaunion.or ...

  5. java获取jsp 组件,利用Observer模式解决组件间通信问题-JSP教程,Java技巧及代码

    1. 问题的提出 以前做一个界面的时候常常会遇到这样的尴尬情况:希望保留各个独立的组件(类),但又希望它们之间能够相互通信.譬如windows中的explorer,我们希望鼠标点击左边是树型目录的一个 ...

  6. java inner class,C# Inner Class vs. java 的inner class比较-JSP教程,Java技巧及代码

    作者: leafwiz www.aspcool.com 时间:2004-11-6 15:50:57 阅读次数:1811 今天朋友问到,为什么在c#中inner class不能够访问外部类的非静态成员, ...

  7. 用java写四则混合运算,JAVA写的四则混合运算-JSP教程,Java技巧及代码

    这是一个四则混合运算程序,没什么做优化,也没做什么注释,(人啊,总喜欢偷懒的.) 这个版本我已经定为了2.21版本.呵呵. 从最先的1.0到2.0的改动很大.除了运算思想没动处,其它的都在2.0做了重 ...

  8. jsp里加java代码,利用静态内部类为您的代码添加辅助功能-JSP教程,Java技巧及代码...

    利用静态内部类为您的代码添加辅助功能 作者 john d. mitchell 摘要这个技巧提供了一个实例,它可以利用静态内部类为您的类添加独立的.可选的辅助功能,例如测试和示例代码等.( 500 字) ...

  9. java 工具箱安装方法,Java工具包的安装配置和使用-JSP教程,Java技巧及代码

    1.下载j2sdk 1.4.1或更高版本 (http://java.sun.com,建议同时下载其java documentation,这是java帮助文档) 2.运行刚刚下载的j2sdk-1_4_1 ...

最新文章

  1. centos 部署spring boot应用
  2. 数据分析基于朴素贝叶斯的书籍评价信息分类
  3. 第四:Pytest框架之命令行参数(二)
  4. Unity5 Survival Shooter开发笔记(1)
  5. MRP里如何预测lead time :Approaches for the Prediction of Lead Times in an Engineer to Order Environment
  6. 计算机里的文件弄不到桌面怎么办,电脑文件夹在桌面不显示怎么办
  7. Ctrl、Alt、Shift常用的电脑快捷键大全(收藏级)
  8. iap如何初始化_STM32F4-IAP学习笔记(一)
  9. 阿里巴巴icon font导入CSS
  10. Python ln_LN型芯型联轴器
  11. MyEcplise_Maven搭建SSM框架
  12. 诺基亚 Lumia 920T 今日发布 处理器升级
  13. 简单分布式锁实现(拍黄片)
  14. matlab毕达哥拉斯质数,如何求毕达哥拉斯质数对应的两个数字
  15. Gradle-Eclipse插件安装
  16. 入门编程指南:如何从零开始学习编程?
  17. 高并发系统限流最佳实践
  18. TP4056电池(BAT)引脚输出高电平
  19. 【JS中scrollHeight/Width详解(不加定位的情况下)】
  20. HTML 前端 flex宫格布局

热门文章

  1. 窗口分析函数_7_生成指定的分组序号
  2. 服务器销售税率,转销售云服务器税率
  3. 神奇的计算机技术 教案,神奇的笔记本教学设计
  4. Windows下配置R-FCN
  5. 案例:用户登录界面最全详解(JavaWeb)
  6. OpenCV中像素逻辑运算:逻辑非运算
  7. JavaScriptjQuery.document对象属性和方法
  8. Lesson 1#03-Python安装与Hello Python World
  9. Python 2.7:字符串乱码问题的解决
  10. Nagios监控之8:利用mutt+msmtp实现邮件报警