关于线程池和队列的小问题
时间:2008-06-22 18:29:32
来源:论坛整理 作者: 编辑:chinaitzhe
import java.util.*;
class ThreadPoolManager {
private int maxThread;
public Vector vector;
public void setMaxThread(int threadCount) {
}
//设定能控制的最大线程数
public ThreadPoolManager(int threadCount) {
setMaxThread(threadCount);
System.out.println("*开启线程池...共有" threadCount "个线程!");
vector = new Vector();
//循环监控各线程状态
for (int i = 1; i <= threadCount; i ) {
SimpleThread thread = new SimpleThread(i);
vector.addElement(thread); //vector用于存放SimpleThread类
thread.start(); //启动该线程
}
}
//从vector数组中选取SimpleThread线程,监控其状态
public void process(String argument) {
int i;
for (i = 0; i < vector.size(); i ) {
SimpleThread currentThread = (SimpleThread) vector.elementAt(i);
//假如处于激活状态的话,那继续查找vector数组的下一项
if (!currentThread.isRunning()) {
System.out.println("*线程" (i 1) " 正在启动...");//
//argument);
currentThread.setArgument(argument); //将argument转发给SimpleThread类的setArgument()方法进行处理
currentThread.setRunning(true); //唤醒当前线程
return;
}
}
if (i == vector.size()) {
System.out.println("*线程池已满, 等待后重试...");
}
}
}
*********************************************
class SimpleThread extends Thread {
private boolean runningFlag; //标记线程状态
private String argument; //获取输入内容
public boolean isRunning() {
return runningFlag;
}
//控制线程状态
public synchronized void setRunning(boolean flag) {
runningFlag = flag;
if (flag)
this.notify();
}
public String getArgument() {
return this.argument;
}
//argument获取输入内容
public void setArgument(String string) {
argument = string;
}
//提示线程状态
public SimpleThread(int threadNumber) {
runningFlag = false;
System.out.println("线程 " threadNumber "预备...");
}
//实现Thread类的run()接口
public synchronized void run() {
try {
while (true) {
if (!runningFlag) {
this.wait(); //线程调用wait()方法时,则线程进入睡眠状态
} else {
System.out.println("*线程正在处理:" getArgument());
sleep(5000); //5秒后结束该线程
System.out.println("*线程" getArgument() "已休眠...");
setRunning(false);
}
}
} catch (InterruptedException e) {
System.out.println("Interrupt");
}
}
}
********************************************
import java.io.*;
public class TestThreadPool {
public static void main(String[] args) {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.
in));//监控输入
String s;
ThreadPoolManager manager = new ThreadPoolManager(20); //调用ThreadPoolManager类创建线程
while ((s = br.readLine()) != null) {
manager.process(s);
}
} catch (IOException e) {}
}
}
****************************
目的:接受请求后,将请求放入一个先进先出的队列,然后挨个取出来交给线程池处理
问题:上面的线程池该如何修改才能实现目的?
网友回复:此回复为自动发出,仅用于显示而已,并无任何其他非凡作用
楼主截止到2008-06-21 15:54:35的汇总数据:
注册日期:2008-3-11
上次登录:2008-6-21
发帖数:3 发帖分:230
结贴数:2 结贴分:130
结贴率:66.67% 结分率:56.52%
楼主加油
网友回复:那你就写一个方法接受请求
放到队列里面
然后分配线程
你觉得难点在哪
网友回复:我没用过队列
这方面的概念几乎为0
网友回复:java下的Queue应该可以,同时你也可以自己设计一个简单的队列
网友回复:主要问题不是线程池和列队的小问题
主要问题是你的代码太~~~长了
而且应该插入JAVA原代码更好些
看着太累 谁会花时间一行一行读啊~~
帮你贴一下
- Java code
Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ import java.util.*; class ThreadPoolManager { private int maxThread; public Vector vector; public void setMaxThread(int threadCount) { } //设定能控制的最大线程数 public ThreadPoolManager(int threadCount) { setMaxThread(threadCount); System.out.println("*开启线程池...共有" threadCount "个线程!"); vector = new Vector(); //循环监控各线程状态 for (int i = 1; i <= threadCount; i ) { SimpleThread thread = new SimpleThread(i); vector.addElement(thread); //vector用于存放SimpleThread类 thread.start(); //启动该线程 } } //从vector数组中选取SimpleThread线程,监控其状态 public void process(String argument) { int i; for (i = 0; i < vector.size(); i ) { SimpleThread currentThread = (SimpleThread) vector.elementAt(i); //假如处于激活状态的话,那继续查找vector数组的下一项 if (!currentThread.isRunning()) { System.out.println("*线程" (i 1) " 正在启动...");// //argument); currentThread.setArgument(argument); //将argument转发给SimpleThread类的setArgument()方法进行处理 currentThread.setRunning(true); //唤醒当前线程 return; } } if (i == vector.size()) { System.out.println("*线程池已满, 等待后重试..."); } } } ********************************************* class SimpleThread extends Thread { private boolean runningFlag; //标记线程状态 private String argument; //获取输入内容 public boolean isRunning() { return runningFlag; } //控制线程状态 public synchronized void setRunning(boolean flag) { runningFlag = flag; if (flag) this.notify(); } public String getArgument() { return this.argument; } //argument获取输入内容 public void setArgument(String string) { argument = string; } //提示线程状态 public SimpleThread(int threadNumber) { runningFlag = false; System.out.println("线程 " threadNumber "预备..."); } //实现Thread类的run()接口 public synchronized void run() { try { while (true) { if (!runningFlag) { this.wait(); //线程调用wait()方法时,则线程进入睡眠状态 } else { System.out.println("*线程正在处理:" getArgument()); sleep(5000); //5秒后结束该线程 System.out.println("*线程" getArgument() "已休眠..."); setRunning(false); } } } catch (InterruptedException e) { System.out.println("Interrupt"); } } } ******************************************** import java.io.*; public class TestThreadPool { public static void main(String[] args) { try { BufferedReader br = new BufferedReader(new InputStreamReader(System. in));//监控输入 String s; ThreadPoolManager manager = new ThreadPoolManager(20); //调用ThreadPoolManager类创建线程 while ((s = br.readLine()) != null) { manager.process(s); } } catch (IOException e) {} } } ****************************
网友回复:Java 类库中有现成的线程池,参见 java.util.concurrent.ThreadPoolExecutor。
网友回复:我是在上面代码的基础上实现以下功能:
接收到请求后,把请求放进一个先进先出的队列中等待,让一个容量为10的线程池来轮番处理请求.
或者:接收到请求后,假如线程池满的话,就先把请求放入一个先进先出的队列中等待,等线程池空一个位置就从队列中提取一个请求交给线程池处理
关键字:线程,队列,问题,
下一篇:下面没有链接了











文章评论
共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面