java多线程完成一个任务时,采用synchronized同步函数,在线程a调用sleep时,为什么线程b、c没有被阻塞?
代码如下:classMyThreadimplementsRunnable{volatileintflag=0;privateintticket=40;publicvoid...
代码如下:
class MyThread implements Runnable{
volatile int flag = 0;
private int ticket=40;
public void run(){
for(int i =0;i<50 && flag ==0;i++){
sale();
}
}
public synchronized void sale(){
if(this.ticket>0){
System.out.println(Thread.currentThread().getName()+"卖票---->"+(this.ticket--));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
e.printStackTrace();
}
}
}
}
public class ThreadTest{
public static void main(String args[]){
MyThread mt= new MyThread();
Thread t1 = new Thread(mt,"一号窗口");
Thread t2 = new Thread(mt,"二号窗口");
Thread t3 = new Thread(mt,"三号窗口");
try {
t1.start();
t2.start();
t3.start();
System.out.println("休眠开始");
t1.sleep(100000);
System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
System.out.println("休眠结束");
// mt.flag=1;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
在线程t1,t2,t3启动后,t1调用sleep(100000)后,t1不是应该占据资源不释放锁吗?怎么线程t2,t3还可以继续执行?
反复测试发现:t1.sleep()在主线程中执行时暂停的是当前线程相当于Thread.sleep(),并非运行中的t1线程,另外将
for(int i =0;i<50 && flag ==0;i++){ }
放在同步函数内部,就会出现sleep时占用资源的情况,只有t1得到执行 , 函数放在for循环内部,就会t1 t2
t3交替无序执行,为什么函数在for循环内部,t1执行Thread.sleep()无法一直占用资源. 展开
class MyThread implements Runnable{
volatile int flag = 0;
private int ticket=40;
public void run(){
for(int i =0;i<50 && flag ==0;i++){
sale();
}
}
public synchronized void sale(){
if(this.ticket>0){
System.out.println(Thread.currentThread().getName()+"卖票---->"+(this.ticket--));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
e.printStackTrace();
}
}
}
}
public class ThreadTest{
public static void main(String args[]){
MyThread mt= new MyThread();
Thread t1 = new Thread(mt,"一号窗口");
Thread t2 = new Thread(mt,"二号窗口");
Thread t3 = new Thread(mt,"三号窗口");
try {
t1.start();
t2.start();
t3.start();
System.out.println("休眠开始");
t1.sleep(100000);
System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
System.out.println("休眠结束");
// mt.flag=1;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
在线程t1,t2,t3启动后,t1调用sleep(100000)后,t1不是应该占据资源不释放锁吗?怎么线程t2,t3还可以继续执行?
反复测试发现:t1.sleep()在主线程中执行时暂停的是当前线程相当于Thread.sleep(),并非运行中的t1线程,另外将
for(int i =0;i<50 && flag ==0;i++){ }
放在同步函数内部,就会出现sleep时占用资源的情况,只有t1得到执行 , 函数放在for循环内部,就会t1 t2
t3交替无序执行,为什么函数在for循环内部,t1执行Thread.sleep()无法一直占用资源. 展开
1个回答
2015-03-05
展开全部
sleep(100000)你这个是在票卖完之后才执行的,所以你看不到停顿
更多追问追答
追问
你好,我将票源扩大到了400张,我的执行结果仍显示在卖完票前,t1.sleep(10000)已经得到执行了,但是票最终还是没有停顿。。。。程序执行结果如下:
一号窗口卖票---->400
休眠开始
一号窗口卖票---->399
…………………………
三号窗口卖票---->390
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
休眠结束
三号窗口卖票---->389
追答
400张对于java执行的速度太小了吧。每秒就上万次了,你这样吧,太多了不好看出来,你就用一张票,我测试了下,一张票肯定只有一个人卖的出去,这是可以的,如果去掉synchronized 这样的话,我那边是1和3都可以卖出一张,2的时候0张
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询