wild84 2017-03-06 10:07 采纳率: 80%
浏览 6154
已采纳

java多线程如何让一个线程只执行一次?

java多线程如何让一个线程只执行一次?我目前只能是检测到getname()然后用wait()方法。想知道还有没其他方法?

 public class TicketSale {

    public static void main(String[] args) {
        Runnable r1=new Ticket();
        Thread t1=new Thread(r1);
        Thread t2=new Thread(r1);
        Thread t3=new Thread(r1);
        t1.setName("黄牛党");
        t2.setName("桃跑跑");
        t3.setName("张票票");
        t1.start();
        t2.start();
        t3.start();
    }

}
class Ticket implements Runnable{
    private int ticket=10;
    private int num=1;
    public synchronized void sale(){

        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        if(ticket>0){
            System.out.println(Thread.currentThread().getName()+"抢到第"+(num++)+
                    "张票。剩余"+((ticket--)-1)+"张票。");
        }
        if(ticket==0){
            notify();
            System.out.println("票已全部售完");
        }
        if("黄牛党".equals(Thread.currentThread().getName())){
                Thread.currentThread().interrupted();
        }
    }
    @Override
    public void run() {
            while(num<10){
                    sale();
            }

    }
}
  • 写回答

4条回答

  • 剑风偏冷 2017-03-06 10:13
    关注

    使用stop方法强行终止线程(这个方法不推荐使用,因为stop和suspend、resume一样,也可能发生不可预料的结果)。

    使用interrupt方法中断线程。

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

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料