关于线程等待问题

fuckme123 2014-09-10 04:25:43
我有个方法A吃饭,可以多人吃饭,公司一共100个人,有一个主线程在让100个人去吃饭;现在外来一个命令,有几个外来人需要吃饭,我就想等主线程等公司当前那个人吃完饭后,先暂停,等外来几个人吃完饭之后,再继续主线程里面的人吃饭。类似插队那个意思。
有没有大神帮忙,wait()和notify()好像都无法解决。


...全文
517 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
用nofity()方法实现线程通信,再设置线程优先级priority
  • 打赏
  • 举报
回复
引用 21 楼 lliiqiang 的回复:
公司的人吃饭都要不断地获取吃饭锁,内部吃饭与插队共用一个锁,不过插队者只需要进来的时候获取一次锁就可以了,只要插队成功就直接吃饭直到吃饭再释放锁.
能不能提供伪代码 参考参考?
lliiqiang 2014-09-19
  • 打赏
  • 举报
回复
公司的人吃饭都要不断地获取吃饭锁,内部吃饭与插队共用一个锁,不过插队者只需要进来的时候获取一次锁就可以了,只要插队成功就直接吃饭直到吃饭再释放锁.
skgary 2014-09-17
  • 打赏
  • 举报
回复
不如这样子,你写一段伪代码来模拟一下领位员的工作。
  • 打赏
  • 举报
回复
引用 16 楼 fuckme123 的回复:
import java.util.Queue;

class TestQueue {
	PriorityQueue VIPqueue = new LinkedList<String>();
	Queue 普通queue = new LinkedList<String>();;
	Thread autoThread;
	
	public VIP(){
		println "VIP的人来抢饭吃了,警报-------------------------"
		VIPqueue.add("小米");
		VIPqueue.add("小明");
		VIPqueue.add("小敏");
		VIPqueue.add("小蜜");
		VIPqueue.add("消灭");
		VIPqueue.add("小名");
		VIPqueue.add("校门");
		吃饭(VIPqueue);
		VIPqueue.remove();
		println "VIP的人全部吃完饭了。。。。"
	}
	
	public 吃饭(Queue queue){
		queue.each {name ->
			println name + ":吃饭ing....";
			this.sleep(1000);
		}
	}
	
	public 普通(){
	autoThread = new Thread(new Runnable(){
		public void run(){
			while((new Date()).format("HH") < "17"){
				
				普通queue.add("北鼻");
				普通queue.add("贝贝");
				普通queue.add("北北");
				普通queue.add("背包");
				普通queue.add("背部");
				普通queue.add("北边");
				普通queue.add("北碚");
				println "普通的人开始吃饭了**********************"
				吃饭(普通queue);
				println "普通的人全部吃完饭了。。。。睡2分钟,然后再继续吃。。。。"
				this.sleep(2 * 60 * 1000);
			}
		}
	});
	autoThread.start();
}
	
	public static void main(def arg){
		TestQueue tq = new TestQueue();
		tq.普通();
		this.sleep(3000);
		tq.VIP();
	}
这是我写的一个伪代码,求替换,求指导
  • 打赏
  • 举报
回复
import java.util.Queue;

class TestQueue {
	PriorityQueue VIPqueue = new LinkedList<String>();
	Queue 普通queue = new LinkedList<String>();;
	Thread autoThread;
	
	public VIP(){
		println "VIP的人来抢饭吃了,警报-------------------------"
		VIPqueue.add("小米");
		VIPqueue.add("小明");
		VIPqueue.add("小敏");
		VIPqueue.add("小蜜");
		VIPqueue.add("消灭");
		VIPqueue.add("小名");
		VIPqueue.add("校门");
		吃饭(VIPqueue);
		VIPqueue.remove();
		println "VIP的人全部吃完饭了。。。。"
	}
	
	public 吃饭(Queue queue){
		queue.each {name ->
			println name + ":吃饭ing....";
			this.sleep(1000);
		}
	}
	
	public 普通(){
	autoThread = new Thread(new Runnable(){
		public void run(){
			while((new Date()).format("HH") < "17"){
				
				普通queue.add("北鼻");
				普通queue.add("贝贝");
				普通queue.add("北北");
				普通queue.add("背包");
				普通queue.add("背部");
				普通queue.add("北边");
				普通queue.add("北碚");
				println "普通的人开始吃饭了**********************"
				吃饭(普通queue);
				println "普通的人全部吃完饭了。。。。睡2分钟,然后再继续吃。。。。"
				this.sleep(2 * 60 * 1000);
			}
		}
	});
	autoThread.start();
}
	
	public static void main(def arg){
		TestQueue tq = new TestQueue();
		tq.普通();
		this.sleep(3000);
		tq.VIP();
	}
  • 打赏
  • 举报
回复
引用 7 楼 a12939026 的回复:
楼主的需求不复杂啊。 楼上几位想多了吧。 楼主的需求是等公司当前那个人吃完饭后,就是VIP们只插队,但是不会把吃饭的人赶下桌子。 那你建2个排队的队列,普通队列和VIP队列,比如现在有3个桌子供吃饭,每当有桌子空出来,就先去VIP队列中看看有没有人在等,没有的话再去普通人队列中寻找,就OK了啊。
怎么区分VIP队列和普通队列啊? 程序又怎么判断的。
skgary 2014-09-17
  • 打赏
  • 举报
回复
引用 19 楼 fuckme123 的回复:
[quote=引用 18 楼 skgary 的回复:] 不如这样子,你写一段伪代码来模拟一下领位员的工作。
16楼 有个我写的伪代码。[/quote] 我看过了,别想着吃饭,想想饭店门口的领位员怎么办事就行了。
  • 打赏
  • 举报
回复
引用 18 楼 skgary 的回复:
不如这样子,你写一段伪代码来模拟一下领位员的工作。
16楼 有个我写的伪代码。
mahaixing 2014-09-15
  • 打赏
  • 举报
回复
可以用join,也可以用类似于linux pid文件方式,有人来就生成一个锁文件。 www.4byte.cn
windsunmoon 2014-09-15
  • 打赏
  • 举报
回复
引用 12 楼 u013558123 的回复:
或者用优先级设置也不错
优先级肯定不行。去看java优先级的定义。
  • 打赏
  • 举报
回复
或者用优先级设置也不错
  • 打赏
  • 举报
回复
用 JOIN方法
class Sleeper extends Thread{
	private int duration;
	public Sleeper(String name,int sleepTime){
		super(name);
		duration=sleepTime;
		start();
		
	}
	
	public void run(){
		try{
			for(int i=0;i<50;i++){
				System.out.println(i);
			}
			sleep(duration);
		}catch(InterruptedException e){
			System.out.println(getName() + "was interrupted" + "is Interrupted" + isInterrupted());
			return;
		}
		System.out.println(getName()+ "has awakened");
	}
}
class Joiner extends Thread{
	private Sleeper sleeper;
	public Joiner(String name,Sleeper sleeper){
		super(name);
		this.sleeper=sleeper;
		start();
	}
	public void run(){
		try{
			sleeper.join();
		}catch(InterruptedException e){
			e.printStackTrace();
		}
		
		System.out.println(getName()+ "join completed");
	}
}
public class Joining {
	public static void main(String[] arg){
		Sleeper s1= new Sleeper("sleepy",2000),
			s2=new Sleeper("grumpy",2000);
		Joiner j1= new Joiner("dopey",s1),
			j2=new Joiner("doc",s2);
	}
}
小绵羊 2014-09-12
  • 打赏
  • 举报
回复
list也可以搞定 //插队,想插到哪里都行 list.add(0,xxx); //排队 list.add(xxx);
小绵羊 2014-09-12
  • 打赏
  • 举报
回复
队列啊,把要插队的人直接插到队列前面。

Deque<Object> deque = new LinkedList<Object>();

		// 插队
		deque.offerFirst(new Object());

		// 排队
		deque.offerLast(new Object());
普凡 2014-09-12
  • 打赏
  • 举报
回复
引用 4 楼 fuckme123 的回复:
[quote=引用 3 楼 kk_124 的回复:] 优先级。。。
怎么个优先级法?[/quote] 优先级队列
a12939026 2014-09-11
  • 打赏
  • 举报
回复
楼主的需求不复杂啊。 楼上几位想多了吧。 楼主的需求是等公司当前那个人吃完饭后,就是VIP们只插队,但是不会把吃饭的人赶下桌子。 那你建2个排队的队列,普通队列和VIP队列,比如现在有3个桌子供吃饭,每当有桌子空出来,就先去VIP队列中看看有没有人在等,没有的话再去普通人队列中寻找,就OK了啊。
skgary 2014-09-11
  • 打赏
  • 举报
回复
引用 楼主 fuckme123 的回复:
我有个方法A吃饭,可以多人吃饭,公司一共100个人,有一个主线程在让100个人去吃饭;现在外来一个命令,有几个外来人需要吃饭,我就想等主线程等公司当前那个人吃完饭后,先暂停,等外来几个人吃完饭之后,再继续主线程里面的人吃饭。类似插队那个意思。 有没有大神帮忙,wait()和notify()好像都无法解决。
排两个队呗。 VIP一个队,普通人一个队。。。。
??435 2014-09-11
  • 打赏
  • 举报
回复
把需要先执行的线程设置优先级,就是调用join()方法
  • 打赏
  • 举报
回复
引用 3 楼 kk_124 的回复:
优先级。。。
怎么个优先级法?
加载更多回复(3)

62,614

社区成员

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

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