qq_41123677 2021-08-10 21:19 采纳率: 100%
浏览 29
已结题

Java 加了同步代码块后变单线程了

package XianCheng;

public class RunnableS implements Runnable {
private Integer i = 100;
private Object obj = new Object();
private int aa = 0;

@Override
public void run() {
    while (true) {
        if (aa % 2 == 0) {
            synchronized (obj) {
                if (i > 0) {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + "卖第" + i + "张票" + aa);
                    i--;
                }
            }
        } else {
            synchronized (obj) {
                if (i > 0) {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + "卖第" + i + "张票" + "else");
                    i--;
                }
            }
        } aa++;

    }

}

}

public static void main(String[] args) {
RunnableS rr = new RunnableS();
Thread t1 = new Thread(rr,"1号窗口");
Thread t2 = new Thread(rr,"2号窗口");
Thread t3 = new Thread(rr,"3号窗口");
Thread t5 = new Thread(rr,"4号");
t1.start();
t2.start();
t3.start();
t5.start();

  • 写回答

2条回答 默认 最新

  • Winson.J 2021-08-11 10:58
    关注

    是不是到了考试季,这几天经常看到同样的问题在提问,下面的代码可以参考
    公共资源类

    package com.test.thread;
     
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
     
    /**
     * 共享资源,这里就是100张票
     * @author Jiyh
     *
     */
    public class Tickets {
     
        //总票数
        private int tickets = 10;
        
        //锁
        private Lock lock = new ReentrantLock();
        
        public int sellTicket(){
            int currTicket = 0;
            try {
                lock.lock();
                if(tickets > 0){
                    currTicket = tickets;
                    tickets--;
                }
                 
            } catch (Exception e) {
                // TODO: handle exception
            }finally{
                lock.unlock();
            }
            return currTicket;
        }
    }
    
    

    线程类

    package com.test.thread;
     
    public class SellTicket implements Runnable {
        
        //公共资源对象
        private Tickets tickets;
        
        public SellTicket(Tickets tickets){
            this.tickets = tickets;
        }
        
        @Override
        public void run() {
            while (true){
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                int ticket = tickets.sellTicket();
                if(ticket <= 0){
                    System.out.println(Thread.currentThread().getName()+"->票卖完了,退出");
                    break;
                    
                }
                System.out.println(Thread.currentThread().getName()+"->卖出第"+ticket+"张票");
            }
     
        }
     
    }
    
    

    测试类

    package com.test.thread;
     
    public class Test {
     
        public static void main(String[] args) {
            Tickets tickets = new Tickets();//公共资源,同一个对象传给不同线程
            
            //以下创建的3个线程,共享tickets 资源
            SellTicket st1 = new SellTicket(tickets);
            Thread t1 = new Thread(st1, "窗口一");
            
            SellTicket st2 = new SellTicket(tickets);
            Thread t2 = new Thread(st1, "窗口二");
            
            SellTicket st3 = new SellTicket(tickets);
            Thread t3= new Thread(st1, "窗口三");
            
            t1.start();
            t2.start();
            t3.start();
            
        }
    }
    
    
    

    结果

    img

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 8月19日
  • 已采纳回答 8月11日
  • 创建了问题 8月10日

悬赏问题

  • ¥15 关于#java#的问题:找一份能快速看完mooc视频的代码
  • ¥15 这种微信登录授权 谁可以做啊
  • ¥15 请问我该如何添加自己的数据去运行蚁群算法代码
  • ¥20 用HslCommunication 连接欧姆龙 plc有时会连接失败。报异常为“未知错误”
  • ¥15 网络设备配置与管理这个该怎么弄
  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!