自己无聊根据视频写了一个抢票的的程序,但是出了点问题 线程安全 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 sleep时线程没有放开锁,要用wait才行。代码改为:class Web12306 implements Runnable { int Num = 20; private boolean flag = true; public synchronized void run() { while (flag) { if (Num <= 0) { flag = false; return; } System.out.println(Thread.currentThread().getName() + "抢到了" + Num--); try { wait(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }}public class SynDemo1 { public static void main(String[] args) { // 创建真实角色 Web12306 web = new Web12306(); // 创建代理角色 Thread t1 = new Thread(web, "黄牛A"); Thread t2 = new Thread(web, "路人甲"); Thread t3 = new Thread(web, "某某乙"); // 通过代理角色调用start() t1.start(); t2.start(); t3.start(); }} 请问一下我是不是sleep里面不应该写一个常数1000?应该每个线程都写一个随机数? @lz:不是啊,问题不是sleep多久,因为不管sleep多久,先进去的那个线程都会抱着锁睡觉,而不会放开锁,所以一直都是他一个人在运行,其他线程都没机会进去(没有锁进不去啊),所以应该改为wait方法,这个方法在等待是会放开锁,其他人才进的来。ps:sleep是Thread的方法,wait是Object的方法,lz可以查一下这两个方法的比较。 绝对木有鄙视我只是一看觉着这个程序应该都无法运行,不过你后面修改了你这个一个线程进去后就占有一直没释放其他的肯定是进去不了的你老师说是sleep的问题,我一下子就不敢出声了 很正常,你的循环位置放错了,将你的同步方法给成同步代码块,放在while循环里面,就不会出现只有黄牛A在抢票的情况了,之前的同步方法,一旦进入,你的线程其实一致在占据着锁,而且还是一直在while循环当中,sleep只失去执行权和执行资格,但是没有释放所,其他线程都进不来 看你这名字取得,抢票当然是黄牛党的活啦以上纯属开玩笑,我觉得不用sleep也可以的,现在的CPU应该起码都是双核4线程吧,所以无觉得不用sleep java飞屏制作 如何给程序添加一个起始界面 swt弹出的ColorDialog对话框问题 java中的数组排序和C语言一样吗? 一个关与equals()的小问题 请教:一个全局对象,new了好多次,是不是导致内存一直增加? 想知道java如何生成exe文件,急 微电,请进,领分! 为什么vj++中没找到javax.*的包?? 怎么没人给出令人满意的回答啊,我再加点分。高手指点吧,没办法了 阻塞队列 关于String的 == 问题?
代码改为:
class Web12306 implements Runnable {
int Num = 20;
private boolean flag = true;
public synchronized void run() {
while (flag) {
if (Num <= 0) {
flag = false;
return;
}
System.out.println(Thread.currentThread().getName() + "抢到了" + Num--);
try {
wait(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class SynDemo1 {
public static void main(String[] args) {
// 创建真实角色
Web12306 web = new Web12306();
// 创建代理角色
Thread t1 = new Thread(web, "黄牛A");
Thread t2 = new Thread(web, "路人甲");
Thread t3 = new Thread(web, "某某乙");
// 通过代理角色调用start()
t1.start();
t2.start();
t3.start();
}
}
ps:sleep是Thread的方法,wait是Object的方法,lz可以查一下这两个方法的比较。
绝对木有鄙视
我只是一看觉着这个程序应该都无法运行,不过你后面修改了
你这个一个线程进去后就占有一直没释放其他的肯定是进去不了的
你老师说是sleep的问题,我一下子就不敢出声了
以上纯属开玩笑,我觉得不用sleep也可以的,现在的CPU应该起码都是双核4线程吧,所以无觉得不用sleep