快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

Java游戏起步:(一)线程与线程池

任何游戏都至少需要运行两个线程,主线程和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<numThreads; 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<count; 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<numTasks; 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版的MD5
下一教程: 用 Java 保存位图文件

您可以阅读与"Java游戏起步:(一)线程与线程池"相关的教程:
· Java游戏起步:(二)图形基础和显示文字
· 100行Java代码构建一个线程池
· Java多线程中的两个问题
· Java 程序中的多线程
· Java 理论与实践:嗨,我的线程到哪里去了?
    微笑服务 优质保证 索取样品