欢迎光临
我们一直在努力

Java游戏起步:(一)线程与线程池-JSP教程,Java技巧及代码

建站超值云服务器,限时71元/月

任何游戏都至少需要运行两个线程,主线程和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");

}

};

}

}

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

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

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » Java游戏起步:(一)线程与线程池-JSP教程,Java技巧及代码
分享到: 更多 (0)