代码块与函数间的同步,其中一个线程只运行了一次

问题描述

publicclassThreadDemo3{publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubThreadTest2test2=newThreadTest2();newThread(test2).start();//这个线程调用同步代码块//让主线程暂停一会儿try{Thread.sleep(1);}catch(Exceptione){//TODO:handleexceptionSystem.out.println(e.getMessage());}test2.str="method";newThread(test2).start();//这个线程调用同步函数}}publicclassThreadTest2implementsRunnable{privateinttickets=100;Stringstr=newString("");publicvoidrun(){//TODOAuto-generatedmethodstubif(str.equals("method")){while(true){sale2();}}else{synchronized(this){if(tickets>0){try{Thread.sleep(10);}catch(Exceptione){//TODO:handleexceptionSystem.out.println(e.getMessage());}}System.out.println(Thread.currentThread().getName()+"issalingticket"+tickets--);}}}publicsynchronizedvoidsale2(){if(tickets>0){try{Thread.sleep(10);}catch(Exceptione){//TODO:handleexceptionSystem.out.println(e.getMessage());}System.out.print("test:");System.out.println(Thread.currentThread().getName()+"issalingticket"+tickets--);}}}

解决方案

解决方案二:
你的run()方法里的else分支里没有加while(true),所以进入else分支后只会运行一次,应该改为else{while(true){synchronized(this){if(tickets>0)...}//endsynchronized}//endwhile}//endwhile
解决方案三:

解决方案四:
引用1楼ProgramMonkey2014的回复:

你的run()方法里的else分支里没有加while(true),所以进入else分支后只会运行一次,应该改为else{while(true){synchronized(this){if(tickets>0)...}//endsynchronized}//endwhile}//endwhile

楼上正解

时间: 2024-08-23 19:30:05

代码块与函数间的同步,其中一个线程只运行了一次的相关文章

代码块与函数间的同步。为什么线程0只执行了一次

问题描述 publicclassThreadDemo3{publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubThreadTest2test2=newThreadTest2();newThread(test2).start();//这个线程调用同步代码块//让主线程暂停一秒try{Thread.sleep(10);}catch(Exceptione){//TODO:handleexceptionSystem.out.pr

线程-同步代码块的问题。。。。。

问题描述 同步代码块的问题..... 数据库的几张表常用表的数据,我想写到几个静态变量中. 然后提供若干个get方法,同时还有一个set方法重置所有的静态变量. 请问如何能够在set重置方法没完成以前,让get方法的线程等待? 同时几个get方法又不能有相互影响. 就是set没完成,所有的get需要等待,但是不同的get之间没完成不需要等待. 来人啊... 解决方案 http://my.oschina.net/tinglanrmb32/blog/339661 解决方案二: http://blog

JAVA之旅(十三)——线程的安全性,synchronized关键字,多线程同步代码块,同步函数,同步函数的锁是this

JAVA之旅(十三)--线程的安全性,synchronized关键字,多线程同步代码块,同步函数,同步函数的锁是this 我们继续上个篇幅接着讲线程的知识点 一.线程的安全性 当我们开启四个窗口(线程)把票陆陆续续的卖完了之后,我们要反思一下,这里面有没有安全隐患呢?在实际情况中,这种事情我们是必须要去考虑安全问题的,那我们模拟一下错误 package com.lgl.hellojava; import javax.security.auth.callback.TextInputCallback

iOS开发系列--Objective-C之协议、代码块、分类

概述 ObjC的语法主要基于smalltalk进行设计的,除了提供常规的面向对象特性外,还增加了很多其他特性,这一节将重点介绍ObjC中一些常用的语法特性.当然这些内容虽然和其他高级语言命名不一样,但是我们都可以在其中找到他们的影子,在文章中我也会对比其他语言进行介绍,这一节的重点内容如下: 协议protocol 代码块block 分类category 协议protocol 在ObjC中使用@protocol定义一组方法规范,实现此协议的类必须实现对应的方法.熟悉面向对象的童鞋都知道接口本身是对

objective-c ——代码块

通过代码块(block)功能,你就能像对待对象一般,指定要在方法和函数中传递任意代码部分. 代码块的声明: int main (int argc, const char * argv[]) { @autoreleasepool { void (^myBlock) (NSString *x);//声明变量 /* 代码块是存储在一个变量中,并且需要参数和声明的返回类型. 返回类型:(本类是void)声明代码块的返回值类型的位置所声明变量的类型定义在同一个地方.在代码块声明中声明的值类型就是代码块执行

java中的静态代码块、构造代码块、构造方法详解_java

运行下面这段代码,观察其结果: package com.test; public class HelloB extends HelloA { public HelloB() { } { System.out.println("I'm B class"); } static { System.out.println("static B"); } public static void main(String[] args) { new HelloB(); } } cla

银行取款[多线程]{使用同步代码块确保线程同步}

经典例子:老婆(朱丽叶)老公(罗密欧),使用银行卡和存折,或者网银等,同时对同一账户操作的安全问题. 此处用多线程实现,同时取款的模拟实现,使用同步代码块确保线程同步,查看取款安全隐患问题,代码如下: --------------------------------------------------------------------------------------------------------------------------------------  * 线程同步 :使用同步块

基本线程同步(五)使用Lock同步代码块

声明:本文是< Java 7 Concurrency Cookbook >的第二章,作者: Javier Fernández González     译者:许巧辉 校对:方腾飞 使用Lock同步代码块 Java提供另外的机制用来同步代码块.它比synchronized关键字更加强大.灵活.它是基于Lock接口和实现它的类(如ReentrantLock).这种机制有如下优势: 它允许以一种更灵活的方式来构建synchronized块.使用synchronized关键字,你必须以结构化方式得到释

线程安全-存储过程怎么让代码块同步执行

问题描述 存储过程怎么让代码块同步执行 问题是这样的:一个表,传入参数(多个) 判断 如果表中有这个数据(有一个或者多个参数标识这条记录唯一),更新这条数据 如果表中不存在这条数据,新增一条. 现在把这个逻辑写到存储过程中了,会出现多个线程同时调用这个存储过程,在查询.没插入之前,有多个线程得到都是数据库没有记录的,导致插入多条数据. 怎么把这个过程变成原子的,锁定这块代码. 锁表不太科学,锁行,因为插入之前,数据是不存在的,也锁不住,求帮忙,非常感谢! 这个问题应该不是事务吧?事务是代码可能执