62,620
社区成员
发帖
与我相关
我的任务
分享
package com.excel;
public class TestTicket {
public static void main(String[] args) {
Test t = new Test();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
class single {
private int k;
private single() {
k = 1000;
};
static single s = new single();
public static single getInstance() {
return s;
}
public int getK() {
return k;
}
public void setK(int k) {
this.k = k;
}
}
/**
* 实现Runnable接口
*/
class Test implements Runnable {
Object obj = new Object();
public void run() {
while (true) {
synchronized (obj) {
if (single.getInstance().getK() > 0) {
System.out.println(Thread.currentThread().getName()
+ "----" + single.getInstance().getK());
single.getInstance().setK(single.getInstance().getK() - 1);
}
}
}
}
}


synchronized(obj)
{
while(true)
{
if(single.getInstance().getK()>0)
{
System.out.println(Thread.currentThread().getName()+"----"+single.getInstance().getK());
single.getInstance().setK(single.getInstance().getK()-1);
}
}
}
首先,你用了一个锁,而且你把while(true)放在了同步代码块里面还没有break,那么,这个对象锁永远也不会释放,所以也就只有被第一个持有的线程永久持有了。。。别的线程只能永久等待。。。。4个线程共同访问obj 对象,其中一条线程得到obj对象锁,其他的一直在等待,也就是你所谓的不工作
把那个地方进行修改后实现了多线程,但是将k值设为1000后,为什么程序只打印出300张票就不再执行了呢