关于线程池和队列的小问题

时间: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 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面