java多线程队列问题

wentshop 2012-05-24 11:33:23

package com.wk.demo.myDuilie;

import java.util.Vector;

public class Test implements Runnable {

public static void main(String[] args) {
CreateName createName = new CreateName();
Manager manager = new Manager();
Test shengren = new Test();
Thread managerThread = new Thread(manager);
Thread createNameThread = new Thread(createName);
createNameThread.start();
managerThread.start();
for (int i = 0; i < 10; i++) {
Thread thread = new Thread(shengren);
thread.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}

@Override
public void run() {
Person person = new Person();
Manager.addPerson(person);
say(person);
}

public void say(Person person) {
while (person.getName() == null) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(person.getName());
}

}

class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

class CreateName implements Runnable {
private void createName() {
Manager.addName(getName());
}
private String getName() {
return "www" + (int) (Math.random() * 100);
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
createName();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

class Manager implements Runnable {
private static Vector<Person> persons = new Vector<Person>();
private static Vector<String> names = new Vector<String>();
public static void addPerson(Person person) {
synchronized (persons) {
persons.insertElementAt(person, persons.size());
}
}
public static void addName(String name) {
synchronized (names) {
names.insertElementAt(name, names.size());
}
}
@Override
public void run() {
while (true) {
if (persons.size() > 0 && names.size() > 0) {
System.out.println("现在有多少个人需要取名:" + persons.size());
System.out.println("现在有多少个名字:" + names.size());
persons.remove(0).setName(names.remove(0));
} else {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}

我想问几个问题:
1.队列操作可是这么模拟的吗?
2.比如说name是连接池中的连接,person是高并发的访问用户,这样做合理吗?
3.Manager 中的 while(true) 好吗,可以用别的方法代替吗?
...全文
525 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
FFF9527 2012-05-25
  • 打赏
  • 举报
回复

class Manager implements Runnable {
private static BlockingQueue<Person> persons = new LinkedBlockingQueue<Person>();
private static BlockingQueue<String> names = new LinkedBlockingQueue<String>();
private static boolean flag = true;
public static void addPerson(Person person) {
try {
persons.put(person);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

public static void addName(String name) {
try {
names.put(name);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

@Override
public void run() {
while (flag) {
System.out.println("现在有多少个人需要取名:" + persons.size());
System.out.println("现在有多少个名字:" + names.size());
try {
persons.take().setName(names.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

public static void exit()
{
persons.clear();
names.clear();
flag = false;
addPerson(new Person());
addName("");
}
}
FFF9527 2012-05-25
  • 打赏
  • 举报
回复
好的代码不一定精简,但是逻辑严密。
FFF9527 2012-05-25
  • 打赏
  • 举报
回复
多线程时,最好采用阻塞式队列(ArrayBlockingQueue,LinkedBlockingQueue, ....),或者自己写同步方法。

不要采用while(true)来读取队列,设置一个flag,当退出时把flag设置为false。

如果采用阻塞式队列,退出时一定要往队列里多添加一条数据,用于退出阻塞的队列。
wentshop 2012-05-25
  • 打赏
  • 举报
回复
求解答
FFF9527 2012-05-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

persons 和 nases 都是 有弹性的,这是的names代表数据库连接池里的连接,persons代表用户,我QQ:8738115 你加我 我把我写的代码发给你 你看看 3Q
引用 7 楼 的回复:

引用 6 楼 的回复:

QQQ 我试试
引用 4 楼 的回复:

Java code

class Manager implements Runnable {……
[/Quote]

上不了QQ...晚上有时间再看吧。。。你先自己调试一下吧...
wentshop 2012-05-25
  • 打赏
  • 举报
回复
persons 和 nases 都是 有弹性的,这是的names代表数据库连接池里的连接,persons代表用户,我QQ:8738115 你加我 我把我写的代码发给你 你看看 3Q
[Quote=引用 7 楼 的回复:]

引用 6 楼 的回复:

QQQ 我试试
引用 4 楼 的回复:

Java code

class Manager implements Runnable {
private static BlockingQueue<Person> persons = new LinkedBlockingQueue<Person>();
private static BlockingQu……
[/Quote]
FFF9527 2012-05-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

QQQ 我试试
引用 4 楼 的回复:

Java code

class Manager implements Runnable {
private static BlockingQueue<Person> persons = new LinkedBlockingQueue<Person>();
private static BlockingQueue<String> name……
[/Quote]

name最好不用阻塞队列,persons中有数据,name无数据或者name有数据,persons无数据都会导致
persons.take().setName(names.take());阻塞。
wentshop 2012-05-25
  • 打赏
  • 举报
回复
QQQ 我试试
[Quote=引用 4 楼 的回复:]

Java code

class Manager implements Runnable {
private static BlockingQueue<Person> persons = new LinkedBlockingQueue<Person>();
private static BlockingQueue<String> names = new LinkedBlocki……
[/Quote]

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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