上面几位朋友不知是没有看清我的题目还是怎么的,答案不是我想要的,我的需求已用红色字体标出来了,有两个:1,必须在方法内,和方法上,都实现加锁,
2,必须两个线程都有执行,我看把几位的代码放进去运行,要么只有一个synchronized,要么一直都是只有一个线程运行,直到结束.
而不仅仅把票卖了,希望朋友们再看下....作者: Tesla时光 时间: 2012-9-9 01:20
这个问题谁能帮我搞定下?我要多个线程一起跑,而不是单个,如果是单个跑完全程,我源代码就实现了作者: 陈振兴 时间: 2012-9-9 01:54
class Sou implements Runnable {
static boolean falg = true;
private static int a = 100; //实例变量
int count = 1;// 定义一个记数器,看最终是不是100张票.
public synchronized void sell() {
int a = 200;//局部变量
while (a > 0) {
if (a > 0) {
System.out.println(Thread.currentThread().getName() + ": " + a
+ "sell--top---" + count++);
try {
Thread.sleep(10);
} catch (Exception e) {
}
a--;
// System.out.println(Thread.currentThread().getName() + ": " + a
// + "sell---end--" + count++);
}
}
}
public void run() {
int a = 150;//局部变量
if (falg) {
while (a > 0) {
synchronized (Sou.class) { //锁标记 this
if (a > 0) {
System.out.println(Thread.currentThread().getName()
+ ": " + a + "run-----" + count++);
try {
Thread.sleep(10);
} catch (Exception e) {
}
a--;
}
}
}
} else {
sell();
}
}
}
Runnable r =new Sou();
Thread t =new Thread(r);
Thread t1 =new Thread(r);
t.start();
try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}
Sou.falg=false;
t1.start();
原因:你在主函数中没有“切换”,就是所指的sleep,调用你的sell(),而你的代码里写的这个主要是因为你的单个线程中实现刷新,而主函数中对于两个线程实现切换。
程序的健壮性:你的实例变量加static表示常量,预编译的时候已经在内存中初始值。 作者: 陈振兴 时间: 2012-9-9 01:57
class Sou implements Runnable {
static boolean falg = true;
private static int a = 100; //实例变量
int count = 1;// 定义一个记数器,看最终是不是100张票.
public synchronized void sell() {
int a = 200;//局部变量
while (a > 0) {
if (a > 0) {
System.out.println(Thread.currentThread().getName() + ": " + a
+ "sell--top---" + count++);
try {
Thread.sleep(10);
} catch (Exception e) {
}
a--;
// System.out.println(Thread.currentThread().getName() + ": " + a
// + "sell---end--" + count++);
}
}
}
public void run() {
//int a = 150;//局部变量
if (falg) {
while (a > 0) {
synchronized (Sou.class) { //锁标记 this
if (a > 0) {
System.out.println(Thread.currentThread().getName()
+ ": " + a + "run-----" + count++);
try {
Thread.sleep(10);
} catch (Exception e) {
}
a--;
}
}
}
} else {
sell();
}
}
}
Runnable r =new Sou();
Thread t =new Thread(r);
Thread t1 =new Thread(r);
t.start();
try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}
Sou.falg=false;
t1.start();
原因:你在主函数中没有“切换”,就是所指的sleep,调用你的sell(),而你的代码里写的这个主要是因为你的单个线程中实现刷新,而主函数中对于两个线程实现切换。
程序的健壮性:你的实例变量加static表示常量,预编译的时候已经在内存中初始值。
注意:局部变量要先赋值,再进行运算,而实例变量均已经赋初值。这是局部变量和实例变量的一大区别。(我程序里面给你加了局部变量,你可以看下效果)这个也是小知识点。作者: 陈振兴 时间: 2012-9-9 01:57
class Sou implements Runnable {
static boolean falg = true;
private static int a = 100; //实例变量
int count = 1;// 定义一个记数器,看最终是不是100张票.
public synchronized void sell() {
int a = 200;//局部变量
while (a > 0) {
if (a > 0) {
System.out.println(Thread.currentThread().getName() + ": " + a
+ "sell--top---" + count++);
try {
Thread.sleep(10);
} catch (Exception e) {
}
a--;
// System.out.println(Thread.currentThread().getName() + ": " + a
// + "sell---end--" + count++);
}
}
}
public void run() {
//int a = 150;//局部变量
if (falg) {
while (a > 0) {
synchronized (Sou.class) { //锁标记 this
if (a > 0) {
System.out.println(Thread.currentThread().getName()
+ ": " + a + "run-----" + count++);
try {
Thread.sleep(10);
} catch (Exception e) {
}
a--;
}
}
}
} else {
sell();
}
}
}
Runnable r =new Sou();
Thread t =new Thread(r);
Thread t1 =new Thread(r);
t.start();
try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}
Sou.falg=false;
t1.start();
原因:你在主函数中没有“切换”,就是所指的sleep,调用你的sell(),而你的代码里写的这个主要是因为你的单个线程中实现刷新,而主函数中对于两个线程实现切换。
程序的健壮性:你的实例变量加static表示常量,预编译的时候已经在内存中初始值。
注意:局部变量要先赋值,再进行运算,而实例变量均已经赋初值。这是局部变量和实例变量的一大区别。(我程序里面给你加了局部变量,你可以看下效果)这个也是小知识点。作者: 陈振兴 时间: 2012-9-9 01:58
class Sou implements Runnable {
static boolean falg = true;
private static int a = 100; //实例变量
int count = 1;// 定义一个记数器,看最终是不是100张票.
public synchronized void sell() {
int a = 200;//局部变量
while (a > 0) {
if (a > 0) {
System.out.println(Thread.currentThread().getName() + ": " + a
+ "sell--top---" + count++);
try {
Thread.sleep(10);
} catch (Exception e) {
}
a--;
// System.out.println(Thread.currentThread().getName() + ": " + a
// + "sell---end--" + count++);
}
}
}
public void run() {
//int a = 150;//局部变量
if (falg) {
while (a > 0) {
synchronized (Sou.class) { //锁标记 this
if (a > 0) {
System.out.println(Thread.currentThread().getName()
+ ": " + a + "run-----" + count++);
try {
Thread.sleep(10);
} catch (Exception e) {
}
a--;
}
}
}
} else {
sell();
}
}
}
Runnable r =new Sou();
Thread t =new Thread(r);
Thread t1 =new Thread(r);
t.start();
try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}
Sou.falg=false;
t1.start();
原因:你在主函数中没有“切换”,就是所指的sleep,调用你的sell(),而你的代码里写的这个主要是因为你的单个线程中实现刷新,而主函数中对于两个线程实现切换。
程序的健壮性:你的实例变量加static表示常量,预编译的时候已经在内存中初始值。
注意:局部变量要先赋值,再进行运算,而实例变量均已经赋初值。这是局部变量和实例变量的一大区别。(程序里面给你加了局部变量,你可以看下效果)这个也是小知识点。作者: 陈振兴 时间: 2012-9-9 01:58
class Sou implements Runnable {
static boolean falg = true;
private static int a = 100; //实例变量
int count = 1;// 定义一个记数器,看最终是不是100张票.
public synchronized void sell() {
int a = 200;//局部变量
while (a > 0) {
if (a > 0) {
System.out.println(Thread.currentThread().getName() + ": " + a
+ "sell--top---" + count++);
try {
Thread.sleep(10);
} catch (Exception e) {
}
a--;
// System.out.println(Thread.currentThread().getName() + ": " + a
// + "sell---end--" + count++);
}
}
}
public void run() {
//int a = 150;//局部变量
if (falg) {
while (a > 0) {
synchronized (Sou.class) { //锁标记 this
if (a > 0) {
System.out.println(Thread.currentThread().getName()
+ ": " + a + "run-----" + count++);
try {
Thread.sleep(10);
} catch (Exception e) {
}
a--;
}
}
}
} else {
sell();
}
}
}
Runnable r =new Sou();
Thread t =new Thread(r);
Thread t1 =new Thread(r);
t.start();
try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}
Sou.falg=false;
t1.start();
原因:你在主函数中没有“切换”,就是所指的sleep,调用你的sell(),而你的代码里写的这个主要是因为你的单个线程中实现刷新,而主函数中对于两个线程实现切换。
程序的健壮性:你的实例变量加static表示常量,预编译的时候已经在内存中初始值。
注意:局部变量要先赋值,再进行运算,而实例变量均已经赋初值。这是局部变量和实例变量的一大区别。(程序里面给你加了局部变量,你可以看下效果)这个也是小知识点。作者: 陈振兴 时间: 2012-9-9 01:59
class Sou implements Runnable {
static boolean falg = true;
private static int a = 100; //实例变量
int count = 1;// 定义一个记数器,看最终是不是100张票.
public synchronized void sell() {
int a = 200;//局部变量
while (a > 0) {
if (a > 0) {
System.out.println(Thread.currentThread().getName() + ": " + a
+ "sell--top---" + count++);
try {
Thread.sleep(10);
} catch (Exception e) {
}
a--;
// System.out.println(Thread.currentThread().getName() + ": " + a
// + "sell---end--" + count++);
}
}
}
public void run() {
//int a = 150;//局部变量
if (falg) {
while (a > 0) {
synchronized (Sou.class) { //锁标记 this
if (a > 0) {
System.out.println(Thread.currentThread().getName()
+ ": " + a + "run-----" + count++);
try {
Thread.sleep(10);
} catch (Exception e) {
}
a--;
}