站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题多线程的同步问题,欢迎指教。

多线程的同步问题,欢迎指教。

摘要: 多线程的同步问题,欢迎指教。


package testthread;
public class TestThread
{
public static void main(String []args)
{
ThreadTest t=new ThreadTest();
new Thread(t).start();//此线程调用同步代码块。
t.str=new String("method");
new Thread(t).start();//此线程调用函数。

}
}

class ThreadTest implements Runnable
{
private int tickets=100;
String str=new String("");
public void run()
{
if(str.equals("method"))
{
while(true)
{
sale();
}
}
else
{
synchronized(str)
{
if(tickets>0)
{
try
{
Thread.sleep(10);
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
System.out.println(Thread.currentThread().getName()+
" is saling ticket "+tickets--);
}
}
}
}
public synchronized void sale()
{
//System.out.println("sale is running");
if(tickets>0)
{
try
{
Thread.sleep(10);
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
System.out.println(Thread.currentThread().getName()+
" is saling ticket "+tickets--);
}
}
}


/**
*这段代码是JAVA就业培训教程里面198页的例子程序,但是运行结果却与教材上大相径庭
*书中的运行结果为THREAD-0与THREAD1同时运行,但我运行的结果却是THREAD-0只在开始
*的时候运行过一次,在此之后一直是THREAD-1在执行。这是为何呢?
*如果在29行,即synchronized(str)之前加上一个WHILE(TRUE)语句,
*两个线程会交互运行。
*不知道是我错误了还是书上错误或者是JDK版本不同所致。谢谢
*/


书中的运行结果为THREAD-0与THREAD1同时运行,但我运行的结果却是THREAD-0只在开始
*的时候运行过一次,在此之后一直是THREAD-1在执行。这是为何呢?

这是正常的。

行1 ThreadTest t=new ThreadTest();
行2 new Thread(t).start();//此线程调用同步代码块。
行3 t.str=new String("method");
行4 new Thread(t).start();//此线程调用函数。

上面是启动线程的行,我们可以看到行2在启动THREAD-0时t.str的值还是new String(""),于是THREAD-0执行run代码中的下面代码
synchronized (str) {
if (tickets > 0) {
try {
Thread.sleep(10);
}
catch (Exception e) {
System.out.println(e.getMessage());
}
System.out.println(Thread.currentThread().getName() + "is saling ticket " + tickets--);
}
}
可以看到这段代码没有while(true)循环,为此执行完成后退出,于是THREAD-0结束,所以THREAD-0只执行一次而已。

那么为什么树上运行时候THREAD-0与THREAD1同时运行,其实我的结果也是这样,我们还是来看
行1 ThreadTest t=new ThreadTest();
行2 new Thread(t).start();//此线程调用同步代码块。
行3 t.str=new String("method");
行4 new Thread(t).start();//此线程调用函数。

行2启动THREAD-0后THREAD-0很有可能还没来得及运行,即cpu还没来得及切换到THREAD-0去执行,那么此时CPU继续执行3,这样t.str=new String("method");
那么接下来不管是THREAD-0还是THREAD-1运行,则都会运行下面这段代码
while (true) {
sale();
}
因为有while(true)循环所以THREAD-0和THREAD-1永远不会结束,所以会交替运行。



搂主可以将代码改成如下

class ThreadTest implements Runnable {
private int tickets = 100;
String str = new String("");
public void run() {
try {
Thread.sleep(100); //我加上去的
}
catch (InterruptedException ex) {
}
if (str.equals("method")) {
while (true) {
sale();
}
}
else {
synchronized (str) {
if (tickets > 0) {
try {
Thread.sleep(10);
}
catch (Exception e) {
System.out.println(e.getMessage());
}
System.out.println(Thread.currentThread().getName() + "a is saling ticket " + tickets--);
}
}
}
}

看第6行,目的是为了让t.str=new String("method");修改后在执行THREAD-0,这样就会看到二个线程交互了(不过有可能交互次数不平均)。


谢谢上面的朋友,解说的很详细。谢谢


↑返回目录
前一篇: 亿分之一的机率被我碰到了,竟然说读取错误!!!!
后一篇: 关于THIS的用法。谢谢