多线程同时开着,有任务了就执行线程的问题

loveguoweike 2014-08-29 11:53:23
小弟最近在做一个线程方面的事情,没有一点思路 希望大神指点
需求是
比如我获取到5个景区,那我就开5个线程,获取到10个景区,那我就开10个线程
线程要一直开着,每个景区来人了,就执行景区对应的线程,其余没有人来的线程就空闲着,

这个线程要一直开着 就像一个服务一样,有人来 我就记录下,

怎么做啊 完全没思路 最好有代码 谢谢了


...全文
1773 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
東刀人 2014-09-19
  • 打赏
  • 举报
回复
进来学习一下……
humanity 2014-09-19
  • 打赏
  • 举报
回复
呵呵,这个样例不错,相当于线程池的情况。 不过样例中的任务队列没有使用同步和阻塞,可以考虑使用 LinkedBlockingQueue 当队列,它可以阻塞式直到有人来玩,当整个系统想退出时放入一个特殊的任务(“我是来扫地关门的,不是来玩的”),在这个 Worker 线程发现特殊的任务时就做特殊的处理。 线程是一直开着的,但当队列中没有任务要处理时就阻塞。
引用 2 楼 oh_Maxy 的回复:
写了个小例子,希望对你有帮助:

import java.util.ArrayList;
import java.util.List;

public class MultiSight {

    public static void main(String[] args) throws InterruptedException {
        // 2个管理员启动
        Governor gov1 = new Governor("管理员A");
        Governor gov2 = new Governor("管理员B");
        new Thread(gov1).start();
        new Thread(gov2).start();

        // 过了5秒,开始来人
        Thread.sleep(5000);

        // 每隔管理员增加5个观光者
        int i = 0;
        for (; i < 5; i++) {
            new Visitor("观光者A队" + i, gov1);
            new Visitor("观光者B队" + i, gov2);
        }

        // 过了10秒又来一波顾客
        Thread.sleep(10000);
        for (; i < 10; i++) {
            new Visitor("观光者A队" + i, gov1);
            new Visitor("观光者B队" + i, gov2);
        }
    }
}

/**
 * 景点管理员
 */
class Governor implements Runnable {
    // 管理员姓名
    private String name;
    // 管理员当前负责的观光者
    private List<Visitor> visitorList = new ArrayList<Visitor>();

    public Governor(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        // 管理员一直在看游客数量
        for (;;) {
            // 有人了!
            if (visitorList.size() > 0) {
                System.out.println(name + "说:终于来人了!");
                // 让第一个人玩
                visitorList.get(0).play();
                // 玩完了让他离开
                visitorList.remove(0);
                // 这里的remove暂时没有考虑同步,可以单独将所有的List操作增加同步关键字
            }
        }
    }

    // 顾客来了!
    public synchronized void comeIn(Visitor visitor) {
        System.out.println(name + "说:顾客" + visitor.getName() + "来了!");
        visitorList.add(visitor);
    }
}

/**
 * 观光者
 */
class Visitor {
    private String name;

    // 一个观光者来了,加入一个景点管理员
    public Visitor(String name, Governor governor) {
        this.name = name;
        governor.comeIn(this);
    }

    // 顾客来了,玩一会儿...
    public void play() {
        System.out.println(name + "开始玩了...");
        // 假设玩了1秒
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(name + "玩好了!");
    }

    public String getName() {
        return name;
    }
}
「已注销」 2014-09-18
  • 打赏
  • 举报
回复
线程池乐意用吗?
oh_Maxy 版主 2014-08-29
  • 打赏
  • 举报
回复
写了个小例子,希望对你有帮助:

import java.util.ArrayList;
import java.util.List;

public class MultiSight {

    public static void main(String[] args) throws InterruptedException {
        // 2个管理员启动
        Governor gov1 = new Governor("管理员A");
        Governor gov2 = new Governor("管理员B");
        new Thread(gov1).start();
        new Thread(gov2).start();

        // 过了5秒,开始来人
        Thread.sleep(5000);

        // 每隔管理员增加5个观光者
        int i = 0;
        for (; i < 5; i++) {
            new Visitor("观光者A队" + i, gov1);
            new Visitor("观光者B队" + i, gov2);
        }

        // 过了10秒又来一波顾客
        Thread.sleep(10000);
        for (; i < 10; i++) {
            new Visitor("观光者A队" + i, gov1);
            new Visitor("观光者B队" + i, gov2);
        }
    }
}

/**
 * 景点管理员
 */
class Governor implements Runnable {
    // 管理员姓名
    private String name;
    // 管理员当前负责的观光者
    private List<Visitor> visitorList = new ArrayList<Visitor>();

    public Governor(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        // 管理员一直在看游客数量
        for (;;) {
            // 有人了!
            if (visitorList.size() > 0) {
                System.out.println(name + "说:终于来人了!");
                // 让第一个人玩
                visitorList.get(0).play();
                // 玩完了让他离开
                visitorList.remove(0);
                // 这里的remove暂时没有考虑同步,可以单独将所有的List操作增加同步关键字
            }
        }
    }

    // 顾客来了!
    public synchronized void comeIn(Visitor visitor) {
        System.out.println(name + "说:顾客" + visitor.getName() + "来了!");
        visitorList.add(visitor);
    }
}

/**
 * 观光者
 */
class Visitor {
    private String name;

    // 一个观光者来了,加入一个景点管理员
    public Visitor(String name, Governor governor) {
        this.name = name;
        governor.comeIn(this);
    }

    // 顾客来了,玩一会儿...
    public void play() {
        System.out.println(name + "开始玩了...");
        // 假设玩了1秒
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(name + "玩好了!");
    }

    public String getName() {
        return name;
    }
}
MiceRice 2014-08-29
  • 打赏
  • 举报
回复
不知道你在说啥。不过如果是不定量任务并发处理的话,可以考虑下用线程池。

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧